1

下面是我用来用 Visual Basic 创建对象的一些代码:

    For indexCounter As Integer = 1 To TotalParticipants Step 1

        participantClock = New Label
        participantClock.Size = New Size(100, 20)
        participantClock.Name = "participantClock" & indexCounter
        participantClock.Location = New Point(139, (5 + ((indexCounter - 1) * 26)))
        participantClock.BorderStyle = BorderStyle.Fixed3D
        participantClock.TextAlign = ContentAlignment.MiddleRight
        CenterPanel.Controls.Add(participantClock)

        participantStop = New Button
        participantStop.Size = New Size(58, 20)
        participantStop.Location = New Point(245, (5 + ((indexCounter - 1) * 26)))
        participantStop.BackColor = Color.Red
        participantStop.ForeColor = Color.White
        participantStop.Font = New Font(participantStop.Font, FontStyle.Bold)
        participantStop.Text = "Stop"
        CenterPanel.Controls.Add(participantStop)

        participantTimer = New Timer
        participantTimer.Start()
        participantTimer.Enabled = True
        participantTimer.Interval = 1

        participantStopwatch = New Stopwatch
        participantStopwatch.Start()
Next

我正在创建一个标签、一个按钮、计时器和秒表。(虽然我有下沉的感觉,因为我在计算时间,所以我不需要计时器和秒表。)

我想做的是创建标签并将该标签的文本设置为秒表中的值。将创建的按钮将停止该秒表。

我遇到的问题是,我不能按名称调用秒表,因为它还没有创建,而 VB 对我大发雷霆。(毕竟它并没有真正宣布。)

所以问题就变成了,如何调用最近动态创建的控件并使用该控件分配事件。如果不可能,我不介意转储表格并重新开始创建 30 个秒表(但如果可能的话,我想避免这种情况)。

谢谢你的帮助。

4

1 回答 1

1

我假设您希望计时器根据秒表的值更新标签。那正确吗?

您可能会尝试的一件有点 hacky 的事情是:
定义一个存储类,如下所示:

Public Class StopwatchStorage
    Public Property Stopwatch as Stopwatch
    Public Property Label as Label
    Public Property Timer as Timer
End Class

在表单顶部定义一个私人列表:

Private _storage as new List(Of StopwatchStorage)

在你的 for 循环结束时这样做

Dim storage As New StopwatchStorage()
storage.Label = participantClock
storage.Timer = participantTimer
storage.Stopwatch = participantStopwatch
_storage.Add(storage)
AddHandler participantTimer.Tick, AddressOf Timer_Tick

上面的代码可以让你访问你在 tick 函数中需要的三个对象。您将不得不遍历 _storage 列表以找到正确的对象“集”,但它应该可以工作:

Private Sub Timer_Tick(sender As Object, args As EventArgs)
    For Each storage As StopwatchStorage In _storage
        If storage.Timer Is sender Then
            storage.Label.Text = storage.Stopwatch.Elapsed
            Exit Sub
        End If
    Next
End Sub

我没有尝试编译该代码,所以我确定有一些拼写错误,但我认为这应该让您了解如何在不需要使用对象名称的情况下引用对象。

于 2012-02-03T06:54:50.407 回答