1

我在项目期间有这个问题。我正在使用 Visual Basic 和Visual Basic 2010 Express Edition编写程序。

我的一个功能是一组控件(准确地说是标签)。它们附加了相同的事件处理程序(基本上是鼠标悬停和鼠标单击)。唯一的区别是它们的名称和位置。

有没有简单的方法来写这个?

我有 200 多个这样的标签,当我为所有这些标签编写相同的事件处理程序时,这将是一团糟。我可以创建一个类或模块来总结组控件的类似行为吗?我该如何使用它?

4

2 回答 2

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
于 2013-06-14T03:56:48.467 回答
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
于 2013-06-14T01:34:27.613 回答