2005-3-17 + 一个简单的自定义控件-支持自动换行的TextBox

还有很多朋友对自定义控件不是很理解,今天用这个小示例来解释一下。
ASP.NET的页面是一个类,该页面上显示的一切都是一些独立的类,比如我们拖了一个textbox进来,或者放了一个自己的用户控件,甚至,页面上的html代码也是一种被称为LiteralControl的类。
说到自己开发控件,见的最多的两个词就是用户控件和自定义server控件,前面的用户控件大家可能都用过,不知有没有注意这个问题:用户控件是由html代码和server控件组成的。按照前面的理论,server控件是类,而所谓自定义server控件,就是我们自己写一个server控件的类。
面向对象编程里有个概念叫继承,就是子类可以继承父类的所有公开的东西。.net为了我们写server控件方便,准备了专门的父类用来让你继承。他们分别是System.Web.UI.Control和System.Web.UI.WebControls.WebControl,比如说repeager继承自前者,而datalist继承自后者,从vs看repeager和datalist的属性视图有明显区别,datalist的属性远比repeater丰富,就是因为WebControl提供了供多可以继承的东西。
你可以根据需要选择直接从这两个类继承,当然也可以直接从一些控件继承。因为大家都是类。今天要说的这个就继承自System.Web.UI.WebControls.TextBox,TextBox继承自WebControl。
一般的文本框不支持自动换行,我们在获得值后需要做一下转换,下面是通常的做法:
//转换格式
private string Format(string msg)
{
msg=ms.Replace( " ", "&nbsp;" ).Replace( Convert.ToString( ( char ) 10 ), "&nbsp;" ).Replace( Convert.ToString( ( char ) 13 ), "<br>" );
return msg;
}
使用替换把换行换成<br>,其实我们完全可以把这个行为写到文本框里面去,让它自己转换,这样我们就不用在外面再费劲。
解决的办法是写一个继承自TextBox的类,然后重写TextBox的Text属性,在输出值之前做转换。
首先要做的当然是新建一个类,然后输入以下代码
using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Notus.RichTextBox
{
/// <summary>
/// 自动处理换行的TextBox
/// </summary>
public class RichTextBox : System.Web.UI.WebControls.TextBox
{
/// <summary>
/// 重写的Text属性,获得经过处理的文本
/// </summary>
public override string Text
{
get
{
return format(base.Text);
}
set
{
base.Text = value;
}
}

//字符转换
private string format(string msg)
{
//这里是生成了三个全新的字符串,如果需要替换的文本太长,就会对性能产生不好的影响
msg=ms.Replace( " ", "&nbsp;" ).Replace( Convert.ToString( ( char ) 10 ), "&nbsp;" ).Replace( Convert.ToString( ( char ) 13 ), "<br>" );
return msg;
}
}
}

这就是我们的自定义server控件的全部内容,把这个类编译成dll,就可以使用了。建议建一个全新的类库项目,然后新建一个这样类,最后生成项目,这样vs就替我们把这个做成dll了,免去了命令行编译的麻烦,以后如果要进行扩展也可以很容易的做到。
一般的自定义控件都应该这样来用
1.打开.aspx的设计视图
2.找出工具箱,在上面点右键-选择“添加/删除项”
3.在弹出的窗口中点浏览,找到你需要的那个自定义控件的.dll
4.添加,完成
5.控件添加到工具箱后,就可以像其他server controls一样使用,在需要的地方拖过去就可以

看,自己写一个server控件是不是很简单呢?你还可以对这个加以改进,比如对文本进行安全性检查等。
如果你还没有写过这个,那就赶快动手试试吧~~ 完成这个后,如果想了解更多关于自定义server控件的东西,可以翻到本站2004年的目录,那里有一大堆相关的笔记。
Happy Programming :)

你可能感兴趣的:(自定义控件)