2013-03-04 330 views
2

在我的項目中,會爲數據庫中的每一行創建一個標籤並將其添加到面板控件中。我需要一個解決方案來實現以下功能: 當計時器滴答時,我希望所有這些標籤文本值與System.Time.Now同步。並且所有這些標籤都因此而得名。我如何從Time.Tick訪問他們的.Text值?如何在VB.NET中更改動態創建的Label的值?

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 

回答

3

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 

值得一提的,但是,是什麼你是d如果您將標籤添加到FlowLayoutPanel控件中,而不是直接在表單上將其標籤添加到單獨的面板中,則可能會簡化oing。

+0

很好解釋。謝謝,它的工作原理。 – Boher 2013-03-04 03:48:28

1

嘗試使用此代碼:

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 
+0

非常感謝您的詳細解答。 – Boher 2013-03-04 03:52:24

相關問題