现在来看复合控件本身。复合控件有两个类,用两个独立的vb源文件实现,分别是composite.vb和checkevent.vb。
【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
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器