如何为许多潜艇编码"一个潜艇"在VB.NET中?

时间:2014-04-22 16:03:28

标签: vb.net

我在表单上有n个标签,例如:Label1,Label2,...,Labeln。通常,当我为所有标签编写Click事件时:

    Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
        Msgbox "1"
    End Sub

Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click Msgbox "2" End Sub Private Sub Labeln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Labeln.Click Msgbox "n" End Sub

当n很大时,写作非常复杂!

现在,我想编写代码只是为了点击Lablei并生成“i”(一个程序到许多程序)。怎么处理?提前谢谢。

6 个答案:

答案 0 :(得分:6)

Private Sub Labeln_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
       Handles Label1.Click, Label2.Click, Label3.Click '...
    Dim l As Label = DirectCast(sender, Label)
    Msgbox l.Name
End Sub

如果n 非常大,请跳过方法的Handles部分并在表单加载中执行此操作:

For Each l As Label in Me.Controls.OfType(Of Label)()
    AddHandler l.Click, AddressOf Labeln_Click
Next

答案 1 :(得分:2)

使用AddHandler创建标签时,您可以动态分配事件处理程序:

Sub test()
    Dim label1 As New Label()
    AddHandler label1.Click, AddressOf HandleLabelClick
    Me.Controls.Add(label1)
End Sub

这是事件处理程序:

Sub HandleLabelClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
    MsgBox(DirectCast(sender, Label).Name)
End Sub

答案 2 :(得分:2)

我不会使用处理程序而是创建一个继承自框架的自定义控件;它会将此消息框作为控件的标准功能。

创建一个新类:

Public Class MyLabel : Inherits Label
    Protected Overrides Sub OnClick(e As EventArgs)
        MyBase.OnClick(e)

        MsgBox(Me.Name)
    End Sub
End Class

编译完成后,它将显示在您的工具箱中。在屏幕上绘制它,看它是否有效。

答案 3 :(得分:0)

根据其他答案,您最好明确添加处理程序。如果在运行时添加标签(在服务器上动态添加),则可以附加到AddHandler定义。如果控件是在设计时构建的(在标记中定义),则将每个控件的OnClick事件处理到同一个处理程序。或者,对于在设计时构建的控件,您可以将每个控件链接到一个方法的Handles定义。

要获取数值,只要ID在文本部分上至少是一致的,就可以使用Substring。或者,只要名称中没有其他数字,您就可以使用regex.match。我喜欢将ID的数字部分附加到下划线后面的ID的末尾。这让我不在乎文本部分是什么,使用.split(" _"),并给我数字。这也允许我在我使用它们来识别祖先 - 与控件相关的对象的后代关系(即用于创建和填充控件的数据表)时附加多个下划线的多个数字值。

你有很多选择,大多数都是平等的。您是否找到了满足您特定需求的解决方案?

答案 4 :(得分:0)

你可以这样写:

Private Sub OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click, Label2.Click, Label3.Click, Label4.Click    
  messagebox.show(directcast(sender, label).text)        
end sub

答案 5 :(得分:0)

试试这个:

Dim i As Integer
Private Sub Form1_Load() Handles MyBase.Load
    For Each l As Label In Me.Controls.OfType(Of Label)()
        AddHandler l.Click, Sub()
                                i = CInt(l.Name.Replace("Label", ""))
                                MsgBox(i)
                            End Sub
    Next
End Sub