本系列希望通过对实例的讲解,能包含自定义控件开发的大部分内容。
2、设计:重写TextBox的Text属性,将TextBox的回车换行符转换为html能够识别的
3、代码:
WrapTextBox.cs:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Text;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- namespace VeryCodes.Web.Controls
- {
- /// <summary>
- /// 该控件扩展了TextBox控件,可以通过设置属性使回车换行转换为html的换行
- /// 适用于多行文本框
- /// </summary>
- [DefaultProperty("Text")]
- [ToolboxData("<{0}:WrapTextBox runat=server></{0}:WrapTextBox>")]
- public class WrapTextBox : System.Web.UI.WebControls.TextBox
- {
- /// <summary>
- /// 是否换行,默认为false
- /// </summary>
- private bool _IsWrap = false;
- /// <summary>
- /// 重写Text属性
- /// </summary>
- public override string Text
- {
- get
- {
- //返回转换后代码
- return format(base.Text);
- }
- set
- {
- base.Text = value;
- }
- }
- /// <summary>
- /// 字符串换行
- /// </summary>
- /// <param name="msg">输入的字符串</param>
- /// <returns>换行后的字符串</returns>
- private string format(string msg)
- {
- if (IsWrap)
- {
- //关键部分,换行符的替换
- msg = msg.Replace(" ", "").Replace(Convert.ToString((char)10), " ").Replace(Convert.ToString((char)13), "<br />");
- }
- return msg;
- }
- /// <summary>
- /// 暴漏一个属性,使控件使用者可以设置是否使用换行符生成功能
- /// </summary>
- [Bindable(true)]
- [Description("是否启用生成换行符")]
- [Category("外观")]
- [DefaultValue("false")]
- public bool IsWrap
- {
- get
- {
- return _IsWrap;
- }
- set
- {
- _IsWrap = value;
- }
- }
- }
- }
(1)WrapTextBoxTest.aspx:
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="WrapTextBoxTest.aspx.cs" Inherits="_Default" ValidateRequest="false" enableEventValidation="false" %>
- <%@ Register Assembly="VeryCodes.Controls" Namespace="VeryCodes.Web.Controls" TagPrefix="cc2" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title>RichTextBox</title>
- </head>
- <body>
- <form id="form1" runat="server">
- <div>
- WrapTextBox控件:<br />
- 输入一段话:<br />
- <cc2:WrapTextBox ID="WrapTextBox1" runat="server" IsWrap="True" Rows="5" TextMode="MultiLine"></cc2:WrapTextBox>
- <br />
- <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="提交" />
- <br />
- 显示:<br />
- <asp:Label ID="Label1" runat="server"></asp:Label></div>
- </form>
- </body>
- </html>
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- public partial class _Default : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- }
- protected void Button1_Click(object sender, EventArgs e)
- {
- this.Label1.Text = this.WrapTextBox1.Text;
- }
- }
(1)这个自定义控件继承了TextBox,这是扩充控件功能基本方式。通过添加或重写属性,增强控件的功能;
(2)DefaultProperty是设置控件默认的属性的,这里是Text属性,就是当选择这个控件的时候,在属性窗口中自动被选中的是Text属性;
(3)[ToolboxData("<{0}:WrapTextBox runat=server>")]这句设置控件拖动到页面后的代码
{0}表示控件标记的前缀,在这个例子中就是cc2:
<%@ Register Assembly="VeryCodes.Controls" Namespace="VeryCodes.Web.Controls" TagPrefix="cc2" %>