我在项目期间有这个问题。我正在使用 Visual Basic 和Visual Basic 2010 Express Edition编写程序。
我的一个功能是一组控件(准确地说是标签)。它们附加了相同的事件处理程序(基本上是鼠标悬停和鼠标单击)。唯一的区别是它们的名称和位置。
有没有简单的方法来写这个?
我有 200 多个这样的标签,当我为所有这些标签编写相同的事件处理程序时,这将是一团糟。我可以创建一个类或模块来总结组控件的类似行为吗?我该如何使用它?
这里有几种技术可能会有所帮助。
首先,考虑将标签添加到列表中。然后你可以通过索引来引用它们。
dim mylabels as New List(Of System.Windows.Forms.Label)
myLabels.Add(label1)
myLabels.Add(label2)
'...
myLabels.Add(label200)
您还可以使用 System.Windows.Forms.Label.Tag 属性来标识每个标签。下面的代码段显示了如何为列表中的标签设置每个标签。
您还可以使用 AddHandler 命令将每个标签与循环中的处理程序相关联。这意味着您不必为每个标签硬编码“Handles labelX.Click”。我也在循环中展示了这一点。
For i = 0 To myLabels.Count - 1
myLabels(i).Tag = i
AddHandler myLabels(i).Click, AddressOf myLabelsClick
Next
最后,您可以编写通用事件处理程序。在处理程序内部,您可以看到哪个标签单击导致处理程序触发,如果需要,您可以按索引引用您的标签。
Sub MyLabelsClick(ByVal sender As Object, ByVal e As System.EventArgs)
Dim lbl As System.Windows.Forms.Label = CType(sender, System.Windows.Forms.Label)
Dim lblNumber As Integer = lbl.Tag
' Examples of things you can do
MsgBox("You clicked Label Number: " & lblNumber)
lbl.Enabled = False
myLabels(21).Text = "New Text"
End Sub
Stack Overflow 网站上有很多关于此的示例...
所以只需这样做:
Sub MyLabelsClick(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles label1.Click, Label2.Click, Label3.Click , ....
Dim lbl As Label = CType(sender, Label)
MsgBox(lbl.Text)
End Sub