我正在研究最终将与调度数据库绑定的概念证明类型情况。作为测试我创建了这个:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'AddButton("test")
addLots()
End Sub
Private Sub AddLots()
Dim x As Integer
For x = 0 To 10
Dim b As New Button
Dim newLabel As New Label
newLabel.Location = New Point(100, x * 20)
newLabel.Name = x
newLabel.BorderStyle = BorderStyle.Fixed3D
newLabel.Text = newLabel.Name
Me.Controls.Add(newLabel)
Me.Controls.Add(b)
b.Location = New Point(20, x * 20)
b.Text = x
b.Tag = x
b.Name = x
AddHandler b.Click, AddressOf Button_Click
Next
End Sub
Private Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim B As Button = sender
MsgBox(B.Name)
End Sub
对于这个概念证明,我只想在按下按钮1时更新标签1文本似乎是一个简单的过程,但它会踢我的屁股。
答案 0 :(得分:0)
对于任何对象,要影响Label
,您需要对它进行引用。就目前而言,您唯一的参考是通过您添加Controls
的父控件的Label
集合,即表单本身。您可以遍历表单的Controls
,一旦找到Label
,就会知道您拥有第一个,或者您可以拨打OfType
和First
或FirstOrDefault
。这假设表单上没有其他Label
控件。
您可能还会考虑使用专用的父控件,以便您知道它只包含您在运行时创建的Label
控件。显而易见的选择是TableLayoutPanel
,因为它也会为你处理布局。
如果通过Controls
集合访问动态控件是一个问题,那么请保留自己的集合。声明类型为List(Of Label)
的成员变量,并将您创建的每个Label
添加到其中。然后,您可以从该集合中访问您的控件,并且知道其中没有其他控件可以混淆。
顺便说一下,如果您在运行时创建这些控件,那么在表单中它们将无法自动处理。请确保您自己处理它们,并对您使用的每个RemoveHandler
使用AddHandler
。
实际上,仔细查看代码,我才意识到Button
和Label
控件之间存在1:1的对应关系。使用它是有道理的。有两个选项是将相应的Label
分配给每个Tag
的{{1}},或者使用分配给成员变量的Button
来存储关系。这样,您就可以在事件处理程序中使用Dictionary(Of Button, Label)
,它将是被点击的sender
,以获取相应的Button
。
选项1。
创建Label
:
Label
在事件处理程序中:
Dim btn As New Button
Dim lbl As New Label
btn.Tag = lbl
选项2。
在班级:
Dim btn = DirectCast(sender, Button)
Dim lbl = DirectCast(btn.Tag, Label)
创建Private labelsByButton As New Dictionary(Of Button, Label)
:
Label
在事件处理程序中:
Dim btn As New Button
Dim lbl As New Label
Me.labelsByButton.Add(btn, lbl)
答案 1 :(得分:0)
我将此添加到按钮点击事件中。看起来效率不高,因为我最终会在表单上有30-40个按钮和控件,但它可以工作。
Private Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim B As Button = sender
Dim lblToChange As Integer = B.Name
For Each objCtrl As Control In Me.Controls
If TypeOf objCtrl Is Label Then
Dim Lbl As Label = DirectCast(objCtrl, Label)
If Lbl.Name = lblToChange Then
Lbl.Text = "This ONe"
End If
End If
Next
End Sub