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. }

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>

(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. }

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

<%@ Register Assembly="VeryCodes.Controls" Namespace="VeryCodes.Web.Controls" TagPrefix="cc2" %>

本节结束。

posted @ 2009-04-23 15:14  peterlee  阅读(308)  评论(0)    收藏  举报