具有相同事件处理程序的VB.NET控件

具有相同事件处理程序的VB.NET控件,vb.net,class,events,methods,controls,Vb.net,Class,Events,Methods,Controls,我在我的项目中有这个问题。我正在用visualbasic编写一个程序 我的功能之一是一组控件(确切地说是标签)。它们附加了相同的事件处理程序(基本上是鼠标悬停和鼠标单击)。唯一的区别是它们的名称和位置 有没有一个简单的方法来写这个 我有200多个这样的标签,当我为所有这些标签编写相同的事件处理程序时,会变得一团糟。我是否可以创建一个类或模块来总结组控件的类似行为?我该如何使用它呢?StackOverflow网站上有很多关于这个的示例 那么就这么做吧: Sub MyLabelsClick(ByVa

我在我的项目中有这个问题。我正在用visualbasic编写一个程序

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

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


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

StackOverflow网站上有很多关于这个的示例

那么就这么做吧:

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

这里有几种技术可能会有所帮助

首先,考虑将标签添加到列表中。然后你可以通过索引来参考它们

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

让我们看看你尝试过什么现在我只是对我程序中的一些标签控件进行硬编码,它们具有相同的事件(只是名称和位置不同)我希望有一种方法可以将这些控件组合在一起,只使用一组事件处理程序进行汇总,比如类或其他东西。有一些解决方案,但告诉你这和给可卡因瘾君子注射海洛因很相似。永远不要创建有200个标签的UI。不要期望用户理解标签是可点击的。扔掉你重新开始的东西。现在使用ListBox、ListView或TreeView。我不想在这里抄近路,请理解我们中的一些人有一个无法更改的截止日期和要求,如果你知道如何做,请提供帮助,如果你不知道或甚至不知道如何回答,请不要在加载中放置无意义的帖子来浪费我的时间()您可以启动对控件的递归搜索,以查找所有标签,并使用AddHandler()命令将它们连接起来。谢谢,但在我的情况下,我必须在sub中参考label1、label2,在这种情况下,我该怎么办?由于某些政策原因,我无法在此处显示我的代码。您是否尝试过该代码。。lbl变量将引用任何处理过的标签,因此它可能是label1或label2或其他标签。@user1452954:别忘了将控件名称添加到句柄列表。.我在程序中输入了完全相同的代码,并尝试使用一些标签,它给了我错误,但是,如果我创建一个新程序并简单地将其添加到其中,则错误消息是:无法将类型为“System.Windows.Forms.Label”的对象强制转换为类型为“Microsoft.Office.Interop.Excel.Label”。@user1452954:您在做什么?它在VS2005上进行了测试。。它会不会出现错误“Microsoft.Office.Interop.Excel.Label”。。你有什么样的标签?