我在表单上有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”(一个程序到许多程序)。怎么处理?提前谢谢。
答案 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