// 將操作委託給標籤對象,標籤對象是一個
// System.Web.UI.WebControls.Label的執行個體
Public Property Text() As String
Get
EnsureChildControls()
Return label.Text
End Get
Set
EnsureChildControls()
label.Text = value
End Set
End Property
我們需要一個文本輸入框讓使用者輸入內容,一個按鈕來提交表單,還要一個向使用者反饋資訊的文字標籤。下面我們來看看Web表單的代碼,複合控制項就是在這裡執行個體化的:
【composite.aspx】
<%@ page language="vb" debug="false" trace="false" %>
<%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %>
<html>
<script language="VB" runat=server>
Private Sub CheckText(sender As Object, e As CheckEventArgs)
If e.Match = false Then
Composite.Text = "<h2>發布內容請遵守本站規則!不得發布攻擊性言辭!</h2>"
Else
Composite.Text = "你提交的內容已通過檢查!"
End If
End Sub
</script>
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("<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
上面代碼的主要任務是:
' 包含定製事件數目據類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事件控制代碼。