Выбор самого последнего динамически создаваемого объекта с помощью VB.NET - PullRequest
1 голос
/ 03 февраля 2012

Ниже приведен код, который я использую для создания объектов с помощью 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 секундомеров вместо этого (но я бы хотел этого избежать, если это возможно).

Спасибо за любую помощь.

1 Ответ

1 голос
/ 03 февраля 2012

Я предполагаю, что вы хотите, чтобы таймер обновил метку на основе значения секундомер .Это правильно?

Одна вещь, которую вы могли бы попробовать, немного хакерская:
Определите класс хранения следующим образом:

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

Приведенный выше код даст вам доступ к трем объектам, которые вам нужны в вашей функции тиков.Вам нужно будет пройтись по списку _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

Я не пытался скомпилировать этот код, поэтому я уверен, что есть несколькоопечатки, но я думаю, что это должно дать вам представление о том, как обращаться к объекту без необходимости использовать имя объекта.

...