ASP.NET自定义控件开发系列(一)
最近做了一些自定义控件的开发工作,虽然遇到一些困难,但是感觉自定义控件的开发在某些时候还是很有好处的,然后就想写一个关于自定义控件开发的系列文章,一是给自己做个备忘;二是把遇到的问题记录下来,希望后来者能少走弯路。
本系列希望通过对实例的讲解,能包含自定义控件开发的大部分内容。
在系列(一)中先介绍一个简单的实例,在网上看到一个很经典的入门级自定义控件的开发,本文即以此为例。
1、需求:含有换行的TextBox控件的Text属性获取的文本能够自动在网页中显示换行
2、设计:重写TextBox的Text属性,将TextBox的回车换行符转换为html能够识别的
3、代码:
WrapTextBox.cs:
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Text;
5using System.Web;
6using System.Web.UI;
7using System.Web.UI.WebControls;
8
9namespace 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
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Text;
5using System.Web;
6using System.Web.UI;
7using System.Web.UI.WebControls;
8
9namespace 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
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:
1using System;
2using System.Data;
3using System.Configuration;
4using System.Web;
5using System.Web.Security;
6using System.Web.UI;
7using System.Web.UI.WebControls;
8using System.Web.UI.WebControls.WebParts;
9using System.Web.UI.HtmlControls;
10
11public 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
2using System.Data;
3using System.Configuration;
4using System.Web;
5using System.Web.Security;
6using System.Web.UI;
7using System.Web.UI.WebControls;
8using System.Web.UI.WebControls.WebParts;
9using System.Web.UI.HtmlControls;
10
11public 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。