通常,VB.NET程序员会创建一个静态设计,而这一设计可以为程序的应用提供所需的一切。但是,在某些情况下,程序员或许不能够事先预计每种需求,这里就需要用到动态代码生成了。
本文的讨论也将着眼于这两种情况。首先是当程序员需要动态建立一个控件并将代码附着于控件之上时。例如,你或许想创建一个链接列表,但是不知道需要创建链接的数量或是链接中会出现什么样的数据。第二种是当程序员需要定义代码以反映出特殊需求的时候。例如,你或许要执行能反映用户系统配置的代码。
类似上述的情况当然不会每天都上演。事实上,它们只在非常情况下才出现。然而,作为程序员,仍然要意识到.NET为解决动态情形提供了方案。有了正确的技巧,你就可以写出能灵活处理动态情况的应用程序了。
使用动态控件
许多程序员总会遇到需要动态创建控件的时候。我们所展示的例子中程序员向FlowLayoutPanel中添加了LinkLabels。或许你可以个这样的设置来记录和保存常用的URL,文件,网络地址或是其他资源所在位置的数值。这一示例没有真正保存链接,但是你可以使用XML序列化功能来实现保存。
每次当用户点击Test按钮时,示例代码就会动态创建一个新的LinkLabel控件。真正的演示代码并不复杂。例一就展示了创建这类控件以及将控件放入FlowLayoutPanel,lstLabel中通常所需要做的一切。
例一:向FlowLayoutPanel中添加新的链接
Private Sub btnTest_Click()
Handles btnTest.Click
' Create a link.
Dim NewLink As LinkLabel =
New LinkLabel()
' Add some properties to it.
NewLink.Text = DateTime.Now
.ToLongTimeString()
' Set the click event handler.
AddHandler NewLink.Click,
AddressOf NewLink_Click
' Place the button on the form.
lstLinks.Controls.Add(NewLink)
End Sub
如你所料,该代码开始的时候创建了一个新的LinkLabel并为其赋予了一些值。这一示例使用的是当前时间。你的代码或许能够对某一真实资源进行访问。
请注意该代码也向链接的Click事件中指定了一个处理程序。你必须使用示例中的AddHandler技巧,因为普通的Handles关键词路径不起作用。一方面,设计应用程序的时候你并不清楚控件的名称。即便你为控件指定了一个名称,你也不知道用户要创建的控件数量,所以我们没有办法清楚会有多少处理程序会被创建。处理程序的代码与控件代码类似,因此没有必要创建多个处理程序。用于这个示例的处理代码见例二。例二:处理动态控件点击事件
Private Sub NewLink_Click( _
ByVal sender As System.Object, ByVal e As System.EventArgs)
' Verify that you actually have a LinkLabel
If Not sender.GetType() Is GetType(LinkLabel) Then
MessageBox.Show("Wrong control type provided!")
Return
End If
' Convert the input sender to a Button.
Dim ThisLink As LinkLabel = sender
' Show that we have the correct button.
MessageBox.Show("You created this link at: " + ThisLink.Text)
End Sub