Выбор самого последнего динамически созданного объекта с помощью VB.NET

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

Я создаю метку, кнопку, таймер и секундомер. (Хотя у меня дурное чувство, мне не нужны И таймер, и секундомер, так как я считаю время.)

Что я хотел бы сделать, так это создать метку и установить текст этой метки как значение секундомера. Кнопка, которая будет создана, остановит ЭТОТ секундомер.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу назвать секундомер по имени, так как он еще не создан, и В.Б. шипит на меня за это. (В конце концов, это не было объявлено на самом деле.)

Таким образом, возникает вопрос, как вы вызываете последний динамически созданный элемент управления и назначаете события, используя этот элемент управления. Если это невозможно сделать, я не против сбросить форму и вместо этого начать создавать 30 секундомеров (но я хотел бы избежать этого, если это возможно).

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


person Paul Williams    schedule 03.02.2012    source источник
comment
Что будет делать кнопка, кроме остановки секундомера? Это также остановит таймер?   -  person Chris Dunaway    schedule 03.02.2012
comment
Нет. Динамическая кнопка остановит только связанный с ней секундомер. Отдельное событие будет обрабатывать остановку таймера. Я даже пытаюсь выяснить, нужен ли отдельный таймер для КАЖДОГО секундомера, поскольку он пульсирует только для обновления метки, показывающей прошедшее время, и ничего более.   -  person Paul Williams    schedule 03.02.2012


Ответы (1)


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

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

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

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

person EverPresent    schedule 03.02.2012
comment
Возникла небольшая проблема с вашим кодом. 'Tag' is not a member of 'System.Diagnostics.Stopwatch'. - person Paul Williams; 03.02.2012
comment
Ах да, объект «Секундомер» не является производным от базы управления. Моя ошибка. Я изменил сообщение. Попробуйте что-то вроде того, что упоминается сейчас. - person EverPresent; 04.02.2012
comment
Хорошо, EverPresent. Это изменение ОПРЕДЕЛЕННО работает. Мне просто нужно знать, как подключить кнопку, чтобы остановить этот конкретный таймер. И послать команду остановить ВСЕ таймеры. - person Paul Williams; 04.02.2012
comment
Здорово! Рад, что это работает. Попробуйте добавить объект Button в класс StopwatchStorage точно так же, как и три других объекта. Создайте событие Button_Click и подключите его (точно так же, как Timer_Tick — это только участник AddHandlerStop.Click, AddressOf Button_Click). Затем внутри Button_Click сделайте то же самое для каждого, что у нас есть внутри Timer_Tick, чтобы найти правильный набор объектов. Чтобы отправить команду всем таймерам, просто выполните ForEach через весь список _storage и остановите/запустите таймер или что-то еще. Дайте мне знать, если вам нужна дополнительная помощь по этой части. - person EverPresent; 04.02.2012
comment
Знаете ли вы, есть ли способ просмотреть каждый из них, чтобы получить результаты каждого? То есть получить значение каждого текстового поля и метки? - person Paul Williams; 04.02.2012
comment
Текстовое окно? Вы имели в виду секундомер? Вы можете сделать что-то вроде: For Each storage As StopwatchStorage In _storage следующая строка MessageBox.Show(storage.Label.Text & " - " & storage.Stopwatch.Elapsed. Это то, что вы хотите сделать? (Извините, эти разделы комментариев не подходят для примеров многострочного кода). - person EverPresent; 04.02.2012
comment
давайте продолжим это обсуждение в чате - person Paul Williams; 04.02.2012
comment
Были две дополнительные части, которые я не включил в псевдокод, которые, я думаю, мне придется добавить. Есть метка, которая будет отсчитывать номер участника, и текстовое поле, в котором будет храниться его имя. Я планировал добавить их в хранилище. - person Paul Williams; 04.02.2012