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 に答える