2013-03-04 3 views
2

В моем проекте метка создается для каждой строки в базе данных и добавляется в панель управления. Мне нужно решение для достижения следующего: Когда таймер тикает, я хочу, чтобы все эти текстовые значения меток синхронизировались с System.Time.Now. И все эти ярлыки названы соответственно. Как я могу получить доступ к их .Text-значению из Time.Tick?Как изменить значение динамически созданной метки в VB.NET?

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 вместо этого в отдельные панели непосредственно на форме.

+0

Очень хорошо объяснил. Спасибо, и это работает. – Boher

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

Смежные вопросы