更新动态创建标签中的文本

时间:2014-08-11 22:54:56

标签: vb.net

我正在研究最终将与调度数据库绑定的概念证明类型情况。作为测试我创建了这个:

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文本似乎是一个简单的过程,但它会踢我的屁股。

2 个答案:

答案 0 :(得分:0)

对于任何对象,要影响Label,您需要对它进行引用。就目前而言,您唯一的参考是通过您添加Controls的父控件的Label集合,即表单本身。您可以遍历表单的Controls,一旦找到Label,就会知道您拥有第一个,或者您可以拨打OfTypeFirstFirstOrDefault。这假设表单上没有其他Label控件。

您可能还会考虑使用专用的父控件,以便您知道它只包含您在运行时创建的Label控件。显而易见的选择是TableLayoutPanel,因为它也会为你处理布局。

如果通过Controls集合访问动态控件是一个问题,那么请保留自己的集合。声明类型为List(Of Label)的成员变量,并将您创建的每个Label添加到其中。然后,您可以从该集合中访问您的控件,并且知道其中没有其他控件可以混淆。

顺便说一下,如果您在运行时创建这些控件,那么在表单中它们将无法自动处理。请确保您自己处理它们,并对您使用的每个RemoveHandler使用AddHandler

实际上,仔细查看代码,我才意识到ButtonLabel控件之间存在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