现在来看复合控件本身。复合控件有两个类,用两个独立的VB源文件实现,分别是composite.vb和checkevent.vb。
【composite.vb】
上面代码的主要任务是:
⑴ 首先导入必要的名称空间,声明当前类所属的名称空间。
⑵ 接下来定义Composite的主体。Composite从最基本的Control类继承,另外还要实现INamingContainer接口。INamingContainer接口允许Composite控件将事件转发到它的Button子控件。
⑶ 用CreateChildControls方法(而不是OnInit或构造函数)创建子控件。
⑷ Composite控件没有显露出Button子控件的Click事件。相反,它处理了Click事件,并抛出自定义事件Check。
⑸ Composite控件显露了下列公用属性:Text,即Label子控件的Text属性值;FileName,允许获取和设置定义攻击性词语的XML文件的名字
⑹ 主要的检查功能由CheckString方法实现,它的输入参数是一个文本字符串。CheckString方法从XML文件读取禁用的词语,放入一个数组列表(ArrayList),然后检查指定的字符串是否包含禁用的词语。所有“攻击性”的词语将被适当数量的“*”替代。
⑺ OnPreRender清除文本框子控件的文本。
⑻ 当用户点击按钮,ButtonClicked开始执行。ButtonClicked调用onCheck子过程,传入适当的参数(一个新建的CheckEventArgs对象,创建CheckEventArgs对象的参数是检查前和检查后的文本)。OnCheck随后触发一个事件,该事件将由.aspx页面中的代码处理。
【CheckEvent.vb】
CheckEventArgs的构造函数是两个字符串,根据字符串的值设置相应的匹配标记_match。另外,上面的代码还定义了CheckEventHandler事件句柄。
编写好上面的代码后,如果你没有安装IDE,用下面的命令执行编译即可:
【composite.vb】
Imports System Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Imports System.Xml Imports System.Collections Namespace CustomControls Public Class Composite Inherits Control Implements INamingContainer Private _filename As String = "bad_words.xml" Private label As Label Private box1 As TextBox Public Property filename() As String Get Return _filename End Get Set _filename = value End Set End Property ' 以用户提交的文本内容为输入参数。如果用户提交的内容包含攻击性言辞, ' 则返回修改后的版本, ' 否则,直接返回原始的文本。 Public Function CheckString(InputString as String) as string Dim alWordList As new ArrayList dim xmlDocPath as string = mappathsecure("bad_words.xml") dim xmlReader as XmlTextreader = new xmlTextReader(xmlDocPath) dim element as string dim output as string dim asterisks as string = "*************************" ' 将定义攻击性言辞的xml文件内容读入到一个ArrayList while (xmlReader.Read()) if xmlReader.NodeType=xmlNodeType.Text then alWordList.Add(xmlReader.Value) end if end while xmlReader.Close() ' 检查用户提交的文本内容,将攻击性言辞替换为适当数量的星号 For Each element in alWordList InputString=InputString.Replace(element, asterisks.substring(1, (element.length))) Next Return InputString End Function Public Property Text() As String Get ' 该方法首先检查ChildControlsCreated属性的当前值。如果该值是false, ' 则调用CreateChildControls方法 EnsureChildControls() Return label.Text End Get Set EnsureChildControls() label.Text = value End Set End Property Public Event Check As CheckEventHandler Protected Overridable Sub OnCheck(ce As CheckEventArgs) RaiseEvent Check(Me, ce) End Sub '创建Composite控件的子控件 Protected Overrides Sub CreateChildControls() Controls.Add(New LiteralControl("<h3>请在下面输入文字内容: ")) '文本输入框 Dim box1 As New Textbox() box1.Text = "" Controls.Add(box1) Controls.Add(New LiteralControl("</h3>")) '按钮 Dim button1 As New Button() button1.Text = "提交" Controls.Add(New LiteralControl("<br>")) Controls.Add(button1) ' 将一个事件句柄加入新创建的按钮对象 AddHandler button1.Click, AddressOf Me.ButtonClicked Controls.Add(New LiteralControl("<br><br>")) label = New Label() label.Height = Unit.Pixel(50) label.Width = Unit.Pixel(500) label.Text = "" Controls.Add(label) End Sub Protected Overrides Sub OnPreRender(e As EventArgs) CType(Controls(1), TextBox).Text = "" End Sub Private Sub ButtonClicked(sender As [Object], e As EventArgs) OnCheck(New CheckEventArgs(CType(Controls(1), TextBox).Text, CheckString(CType(Controls(1), TextBox).Text))) End Sub End Class End Namespace |
上面代码的主要任务是:
⑴ 首先导入必要的名称空间,声明当前类所属的名称空间。
⑵ 接下来定义Composite的主体。Composite从最基本的Control类继承,另外还要实现INamingContainer接口。INamingContainer接口允许Composite控件将事件转发到它的Button子控件。
⑶ 用CreateChildControls方法(而不是OnInit或构造函数)创建子控件。
⑷ Composite控件没有显露出Button子控件的Click事件。相反,它处理了Click事件,并抛出自定义事件Check。
⑸ Composite控件显露了下列公用属性:Text,即Label子控件的Text属性值;FileName,允许获取和设置定义攻击性词语的XML文件的名字
⑹ 主要的检查功能由CheckString方法实现,它的输入参数是一个文本字符串。CheckString方法从XML文件读取禁用的词语,放入一个数组列表(ArrayList),然后检查指定的字符串是否包含禁用的词语。所有“攻击性”的词语将被适当数量的“*”替代。
⑺ OnPreRender清除文本框子控件的文本。
⑻ 当用户点击按钮,ButtonClicked开始执行。ButtonClicked调用onCheck子过程,传入适当的参数(一个新建的CheckEventArgs对象,创建CheckEventArgs对象的参数是检查前和检查后的文本)。OnCheck随后触发一个事件,该事件将由.aspx页面中的代码处理。
【CheckEvent.vb】
' 包含定制事件数据类CheckEventArgs的代码. ' 另外还定义了Check事件的事件句柄 Imports System Namespace CustomControls Public Class CheckEventArgs Inherits EventArgs Private _match As Boolean = False Public Sub New(string1 As String, string2 as String) If string1=string2 Then _match = True End If End Sub Public ReadOnly Property Match() As Boolean Get Return _match End Get End Property End Class Public Delegate Sub CheckEventHandler(sender As Object, ce As CheckEventArgs) End Namespace |
CheckEventArgs的构造函数是两个字符串,根据字符串的值设置相应的匹配标记_match。另外,上面的代码还定义了CheckEventHandler事件句柄。
编写好上面的代码后,如果你没有安装IDE,用下面的命令执行编译即可:
vbc /t:library /out:./bin/CustomControls.dll /r:System.dll /r:System.web.dll /r:System.drawing.dll /r:System.Data.dll /r:System.xml.dll *.vb |