2

在我的项目中,为数据库中的每一行创建一个标签并添加到面板控件中。我需要一个解决方案来实现以下目标:当计时器滴答作响时,我希望所有这些标签文本值与 System.Time.Now 同步。所有这些标签都因此命名。如何从 Time.Tick 访问他们的 .Text 值?

For i = 1 To ds.Tables("MyTable").Rows.Count
  Dim NextPanel As New Panel
  Dim NextLabel As Label
  NextPanel.Controls.Add(NextLabel)
  MyForm.Controls.Add(NextPanel)
  NextLabel.Name = "MyLabel" & i
  NextPanel.Name = "MyPanel" & i
Next

在这里我调用这些控件时遇到问题:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        ' I want each label's text to be Time.Now()
End Sub
4

2 回答 2

4

集合属性引用的控件Controls可以通过其名称访问,如下所示:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    For i As Integer = 1 to ds.Tables("MyTable").Rows.Count
        Dim panel As Panel = CType(MyForm.Controls("MyPanel" & i.ToString()), Panel)
        Dim label As Label = CType(panel.Controls("MyLabel" & i.ToString()), Label)
    Next
End Sub

但是,您可能会发现在创建它们时将它们全部添加到列表中更容易,以便以后可以访问它们。例如,如果您像这样创建了几个列表作为表单上的私有字段:

Private myPanels As New List(Of Panel)()
Private myLabels As New List(Of Label)()

然后,当您创建控件时,您可以将它们添加到列表中,如下所示:

For i = 1 To ds.Tables("MyTable").Rows.Count
  Dim nextPanel As New Panel()
  Dim nextLabel As New Label()
  nextPanel.Controls.Add(nextLabel)
  MyForm.Controls.Add(nextPanel)
  nextLabel.Name = "MyLabel" & i.ToString()
  nextPanel.Name = "MyPanel" & i.ToString()

  'Add them to the lists
  myPanels.Add(nextPanel)
  myLabels.Add(nextLabel)
Next

然后,当您需要遍历它们时,它会容易得多,并且您不必关心创建的总数:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    For Each label As Label In myLabels
        ' ...
    Next
End Sub

然而,值得一提的是,如果您将标签添加到FlowLayoutPanel控件而不是直接在表单上的单独面板中,那么您所做的事情可能会大大简化。

于 2013-03-04T01:48:21.043 回答
2

试试这个代码:

Public Class Form1

Private panelList As New List(Of Panel)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    For i = 1 To ds.Tables("MyTable").Rows.Count
        Dim newPanel As New Panel
        newPanel.Name = "MyPanel" & i
        newPanel.Size = New Size(150, 22)
        newPanel.BackColor = Color.Yellow

        If (i = 1) Then
            newPanel.Location = New Point(10, 10)
        Else
            newPanel.Location = New Point(10 * i + ((i - 1) * newPanel.Width), 10)
        End If

        Dim newLabel As New Label
        newLabel.Name = "MyLabel" & i
        newLabel.Dock = DockStyle.Fill
        newPanel.Controls.Add(newLabel)

        Me.Controls.Add(newPanel)

        // save panel in generic list
        panelList.Add(newPanel)
    Next

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    // read panel from generic list
    For Each panel In panelList
        For Each control In panel.Controls
            If TypeOf (control) Is Label Then
                control.Text = control.Name + ": " + DateTime.Now.ToString("dd/mm/yy hh:MM:ss")
            End If
        Next
    Next
End Sub

End Class
于 2013-03-04T01:51:44.843 回答