我的项目中有这个问题。我正在使用带有Visual Basic 2010 Express Edition的Visual Basic编写程序。
我的一个功能是一组控件(确切地说是标签)。它们附带相同的事件处理程序(基本上是鼠标悬停和鼠标单击)。唯一的区别是他们的名字和位置。
有没有简单的方法来写这个?
我有超过200个这样的标签,当我为所有这些标签编写相同的事件处理程序时,它将是一团糟。是否有可以创建的类或模块来总结组控件的类似行为?我该如何使用它?
答案 0 :(得分:2)
这里有几种技巧可能有用。
首先,考虑将标签添加到列表中。然后你可以用索引来引用它们。
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
答案 1 :(得分:0)
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