ASP.NET自定义控件开发系列(一)
最近做了一些自定义控件的开发工作,虽然遇到一些困难,但是感觉自定义控件的开发在某些时候还是很有好处的,然后就想写一个关于自定义控件开发的系列文章,一是给自己做个备忘;二是把遇到的问题记录下来,希望后来者能少走弯路。
本系列希望通过对实例的讲解,能包含自定义控件开发的大部分内容。
在系列(一)中先介绍一个简单的实例,在网上看到一个很经典的入门级自定义控件的开发,本文即以此为例。
1、需求:含有换行的TextBox控件的Text属性获取的文本能够自动在网页中显示换行
2、设计:重写TextBox的Text属性,将TextBox的回车换行符转换为html能够识别的
3、代码:
WrapTextBox.cs:
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Text;
5
using System.Web;
6
using System.Web.UI;
7
using System.Web.UI.WebControls;
8
9
namespace VeryCodes.Web.Controls
10
{
11
/// <summary>
12
/// 该控件扩展了TextBox控件,可以通过设置属性使回车换行转换为html的换行
13
/// 适用于多行文本框
14
/// </summary>
15
[DefaultProperty("Text")]
16
[ToolboxData("<{0}:WrapTextBox runat=server></{0}:WrapTextBox>")]
17
public class WrapTextBox : System.Web.UI.WebControls.TextBox
18
{
19
/// <summary>
20
/// 是否换行,默认为false
21
/// </summary>
22
private bool _IsWrap = false;
23
24
/// <summary>
25
/// 重写Text属性
26
/// </summary>
27
public override string Text
28
{
29
get
30
{
31
//返回转换后代码
32
return format(base.Text);
33
}
34
set
35
{
36
base.Text = value;
37
}
38
}
39
40
/// <summary>
41
/// 字符串换行
42
/// </summary>
43
/// <param name="msg">输入的字符串</param>
44
/// <returns>换行后的字符串</returns>
45
private string format(string msg)
46
{
47
if (IsWrap)
48
{
49
//关键部分,换行符的替换
50
msg = msg.Replace(" ", "").Replace(Convert.ToString((char)10), " ").Replace(Convert.ToString((char)13), "<br />");
51
}
52
return msg;
53
}
54
55
/// <summary>
56
/// 暴漏一个属性,使控件使用者可以设置是否使用换行符生成功能
57
/// </summary>
58
[Bindable(true)]
59
[Description("是否启用生成换行符")]
60
[Category("外观")]
61
[DefaultValue("false")]
62
public bool IsWrap
63
{
64
65
get
66
{
67
return _IsWrap;
68
}
69
set
70
{
71
_IsWrap = value;
72
}
73
}
74
}
75
}
76![]()
using System; 2
using System.Collections.Generic; 3
using System.ComponentModel; 4
using System.Text; 5
using System.Web; 6
using System.Web.UI; 7
using System.Web.UI.WebControls; 8
9
namespace VeryCodes.Web.Controls 10
{ 11
/// <summary> 12
/// 该控件扩展了TextBox控件,可以通过设置属性使回车换行转换为html的换行 13
/// 适用于多行文本框 14
/// </summary> 15
[DefaultProperty("Text")] 16
[ToolboxData("<{0}:WrapTextBox runat=server></{0}:WrapTextBox>")] 17
public class WrapTextBox : System.Web.UI.WebControls.TextBox 18
{ 19
/// <summary> 20
/// 是否换行,默认为false 21
/// </summary> 22
private bool _IsWrap = false; 23
24
/// <summary> 25
/// 重写Text属性 26
/// </summary> 27
public override string Text 28
{ 29
get 30
{ 31
//返回转换后代码 32
return format(base.Text); 33
} 34
set 35
{ 36
base.Text = value; 37
} 38
} 39
40
/// <summary> 41
/// 字符串换行 42
/// </summary> 43
/// <param name="msg">输入的字符串</param> 44
/// <returns>换行后的字符串</returns> 45
private string format(string msg) 46
{ 47
if (IsWrap) 48
{ 49
//关键部分,换行符的替换 50
msg = msg.Replace(" ", "").Replace(Convert.ToString((char)10), " ").Replace(Convert.ToString((char)13), "<br />"); 51
} 52
return msg; 53
} 54
55
/// <summary> 56
/// 暴漏一个属性,使控件使用者可以设置是否使用换行符生成功能 57
/// </summary> 58
[Bindable(true)] 59
[Description("是否启用生成换行符")] 60
[Category("外观")] 61
[DefaultValue("false")] 62
public bool IsWrap 63
{ 64
65
get 66
{ 67
return _IsWrap; 68
} 69
set 70
{ 71
_IsWrap = value; 72
} 73
} 74
} 75
}76

4、测试:
(1)WrapTextBoxTest.aspx:
1
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="WrapTextBoxTest.aspx.cs" Inherits="_Default" ValidateRequest="false" enableEventValidation="false" %>
2
<%@ Register Assembly="VeryCodes.Controls" Namespace="VeryCodes.Web.Controls" TagPrefix="cc2" %>
3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4
<html xmlns="http://www.w3.org/1999/xhtml">
5
<head runat="server">
6
<title>RichTextBox</title>
7
</head>
8
<body>
9
<form id="form1" runat="server">
10
<div>
11
WrapTextBox控件:<br />
12
输入一段话:<br />
13
<cc2:WrapTextBox ID="WrapTextBox1" runat="server" IsWrap="True" Rows="5" TextMode="MultiLine"></cc2:WrapTextBox>
14
<br />
15
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="提交" />
16
<br />
17
显示:<br />
18
<asp:Label ID="Label1" runat="server"></asp:Label></div>
19
</form>
20
</body>
21
</html>
22![]()
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="WrapTextBoxTest.aspx.cs" Inherits="_Default" ValidateRequest="false" enableEventValidation="false" %> 2
<%@ Register Assembly="VeryCodes.Controls" Namespace="VeryCodes.Web.Controls" TagPrefix="cc2" %> 3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 4
<html xmlns="http://www.w3.org/1999/xhtml"> 5
<head runat="server"> 6
<title>RichTextBox</title> 7
</head> 8
<body> 9
<form id="form1" runat="server"> 10
<div> 11
WrapTextBox控件:<br /> 12
输入一段话:<br /> 13
<cc2:WrapTextBox ID="WrapTextBox1" runat="server" IsWrap="True" Rows="5" TextMode="MultiLine"></cc2:WrapTextBox> 14
<br /> 15
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="提交" /> 16
<br /> 17
显示:<br /> 18
<asp:Label ID="Label1" runat="server"></asp:Label></div> 19
</form> 20
</body> 21
</html>22

(2)WrapTextBoxTest.aspx.cs:
1
using System;
2
using System.Data;
3
using System.Configuration;
4
using System.Web;
5
using System.Web.Security;
6
using System.Web.UI;
7
using System.Web.UI.WebControls;
8
using System.Web.UI.WebControls.WebParts;
9
using System.Web.UI.HtmlControls;
10
11
public partial class _Default : System.Web.UI.Page
12
{
13
protected void Page_Load(object sender, EventArgs e)
14
{
15
16
}
17
protected void Button1_Click(object sender, EventArgs e)
18
{
19
this.Label1.Text = this.WrapTextBox1.Text;
20
}
21
}
22![]()
using System; 2
using System.Data; 3
using System.Configuration; 4
using System.Web; 5
using System.Web.Security; 6
using System.Web.UI; 7
using System.Web.UI.WebControls; 8
using System.Web.UI.WebControls.WebParts; 9
using System.Web.UI.HtmlControls; 10
11
public partial class _Default : System.Web.UI.Page 12
{ 13
protected void Page_Load(object sender, EventArgs e) 14
{ 15
16
} 17
protected void Button1_Click(object sender, EventArgs e) 18
{ 19
this.Label1.Text = this.WrapTextBox1.Text; 20
} 21
}22

5、总结:
(1)这个自定义控件继承了TextBox,这是扩充控件功能基本方式。通过添加或重写属性,增强控件的功能;
(2)DefaultProperty是设置控件默认的属性的,这里是Text属性,就是当选择这个控件的时候,在属性窗口中自动被选中的是Text属性;
(3)[ToolboxData("<{0}:WrapTextBox runat=server>")]这句设置控件拖动到页面后的代码
{0}表示控件标记的前缀,在这个例子中就是cc2。


浙公网安备 33010602011771号