ASP.NET自定義控件開發系列(一)

最近作了一些自定義控件的開發工做,雖然遇到一些困難,可是感受自定義控件的開發在某些時候仍是頗有好處的,而後就想寫一個關於自定義控件開發的系列文章,一是給本身作個備忘;二是把遇到的問題記錄下來,但願後來者能少走彎路。
本系列但願經過對實例的講解,能包含自定義控件開發的大部份內容。
在系列(一)中先介紹一個簡單的實例,在網上看到一個很經典的入門級自定義控件的開發,本文即以此爲例。
一、需求:含有換行的TextBox控件的Text屬性獲取的文本可以自動在網頁中顯示換行
二、設計:重寫TextBox的Text屬性,將TextBox的回車換行符轉換爲html可以識別的
三、代碼:
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. namespace VeryCodes.Web.Controls
  9. {
  10.       /// <summary>
  11.       /// 該控件擴展了TextBox控件,能夠經過設置屬性使回車換行轉換爲html的換行
  12.     /// 適用於多行文本框
  13.     /// </summary>
  14.     [DefaultProperty("Text")]
  15.     [ToolboxData("<{0}:WrapTextBox runat=server></{0}:WrapTextBox>")]
  16.     public class WrapTextBox : System.Web.UI.WebControls.TextBox
  17.     {
  18.         /// <summary>
  19.         /// 是否換行,默認爲false
  20.         /// </summary>
  21.         private bool _IsWrap = false;
  22.         /// <summary>
  23.         /// 重寫Text屬性
  24.       /// </summary>
  25.         public override string Text
  26.         {
  27.             get
  28.             {
  29.                 //返回轉換後代碼
  30.                 return format(base.Text);
  31.             }
  32.             set
  33.             {
  34.                 base.Text = value;
  35.             }
  36.         }
  37.         /// <summary>
  38.         /// 字符串換行
  39.       /// </summary>
  40.         /// <param name="msg">輸入的字符串</param>
  41.         /// <returns>換行後的字符串</returns>
  42.         private string format(string msg)
  43.         {
  44.             if (IsWrap)
  45.             {
  46.                 //關鍵部分,換行符的替換
  47.                 msg = msg.Replace(" ", "").Replace(Convert.ToString((char)10), " ").Replace(Convert.ToString((char)13), "<br />");
  48.             }
  49.             return msg;
  50.         }
  51.         /// <summary>
  52.         /// 暴漏一個屬性,使控件使用者能夠設置是否使用換行符生成功能
  53.       /// </summary>
  54.         [Bindable(true)]
  55.         [Description("是否啓用生成換行符")]
  56.         [Category("外觀")]
  57.         [DefaultValue("false")]
  58.         public bool IsWrap
  59.         {
  60.             get
  61.             {
  62.                 return _IsWrap;
  63.             }
  64.             set
  65.             {
  66.                 _IsWrap = value;
  67.             }
  68.         }
  69.     }
  70. }
四、測試:
(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. public partial class _Default : System.Web.UI.Page
  11. {
  12.     protected void Page_Load(object sender, EventArgs e)
  13.     {
  14.     }
  15.     protected void Button1_Click(object sender, EventArgs e)
  16.     {
  17.         this.Label1.Text = this.WrapTextBox1.Text;
  18.     }
  19. }
五、總結:
(1)這個自定義控件繼承了TextBox,這是擴充控件功能基本方式。經過添加或重寫屬性,加強控件的功能;
(2)DefaultProperty是設置控件默認的屬性的,這裏是Text屬性,就是當選擇這個控件的時候,在屬性窗口中自動被選中的是Text屬性;
(3)[ToolboxData("<{0}:WrapTextBox runat=server>")]這句設置控件拖動到頁面後的代碼
{0}表示控件標記的前綴,在這個例子中就是cc2:

<%@ Register Assembly="VeryCodes.Controls" Namespace="VeryCodes.Web.Controls" TagPrefix="cc2" %>
本節結束。
相關文章
相關標籤/搜索