Коллекции и Переменные - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть коллекция в Visual Basic.net (извините, если люди видят этот код в девять миллиардов раз ...)

Вот код на данный момент:

Public Class MainFrm

Private _storage As New List(Of StopwatchStorage)

Public TotalParticipants As Integer ' The total number of participants, will be set via an options form.
Private participantLbl As Label ' A label which will hold the ordered number.
Public participantName As TextBox ' A blank textbox to allow the user to name the participant
Private participantClock As Label ' This is a label which will display the stopwatch
Public ParticipantStop As Button ' A button used to the stop the timer on the participant.
Private participantContinue As Button ' A button used to continue the timer when accidentally stopped.
Private participantTimer As Timer ' A timer to continuously update the labels on pulses.
Public eventName As String = "" ' The Event name itself

' The options
Public numEntrants As Integer = 30 ' The maximum number of participants, set at 30 by default.
Public startingEntrants As Integer = 2 ' The number of timers to start simultaneously., set a 2 by default
Public entryTimer As Integer = 90 ' The timer to seperate and space the entries. Set to 90 by default
Public addAuto As Boolean = False ' A checkbox to determine whether or not to automatically add a participant.

Dim counterTimer As Integer ' A simple holder to count down the entryTimer.

Private participantContinueTimers As TimeSpan
Private participantContinuation As New Stopwatch ' A Stopwatch to hold the continuation timer in the event of an error
Private participantStopwatch As New Stopwatch
Private matchStopwatch As New Stopwatch

Private Sub Participant_Stop(sender As Object, args As EventArgs)
    For Each storage As StopwatchStorage In _storage
        If storage.Button Is sender Then
            storage.Stopwatch.Stop()
            storage.Button.Visible = False
            storage.ContinueBtn.Visible = True

            ' Reset the Continuation timer
            storage.Continuation.Start()
        End If
    Next
End Sub


Private Sub StartButton_Click(sender As System.Object, e As System.EventArgs) Handles StartButton.Click
    For indexCounter As Integer = 1 To startingEntrants Step 1
        DrawControls(indexCounter)
    Next
End Sub


Private Sub Participant_Resume(sender As Object, args As EventArgs)
    For Each storage As StopwatchStorage In _storage
        If storage.ContinueBtn Is sender Then
            storage.ContinueBtn.Visible = False
            storage.Button.Visible = True
            storage.Stopwatch.Start()
            storage.Continuation.Stop()

            ' Add the value from storage.Continuation.Elapsed to a continuing tally
            storage.ParticipantContinueTimers += storage.Continuation.Elapsed
            storage.Continuation.Reset()
        End If
    Next
End Sub

Private Sub DrawControls(records As Integer)
    participantLbl = New Label
    participantLbl.Location = New Point(5 + (((records - 1) \ 15) * 321), 5 + (((records - 1) Mod 15) * 26))
    participantLbl.Size = New Size(22, 20)
    participantLbl.TextAlign = ContentAlignment.MiddleCenter
    participantLbl.Text = records
    CenterPanel.Controls.Add(participantLbl)

    participantName = New TextBox
    participantName.Location = New Point(31 + (((records - 1) \ 15) * 321), 5 + (((records - 1) Mod 15) * 26))
    participantName.Size = New Size(105, 20)
    CenterPanel.Controls.Add(participantName)

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

    ParticipantStop = New Button
    ParticipantStop.Size = New Size(63, 20)
    ParticipantStop.Location = New Point(245 + (((records - 1) \ 15) * 321), 5 + (((records - 1) Mod 15) * 26))
    ParticipantStop.BackColor = Color.Red
    ParticipantStop.ForeColor = Color.White
    ParticipantStop.Font = New Font(ParticipantStop.Font, FontStyle.Bold)
    ParticipantStop.Text = "Stop"
    CenterPanel.Controls.Add(ParticipantStop)
    AddHandler ParticipantStop.Click, AddressOf Participant_Stop


    participantContinue = New Button
    participantContinue.Size = New Size(63, 20)
    participantContinue.Location = New Point(245 + (((records - 1) \ 15) * 321), 5 + (((records - 1) Mod 15) * 26))
    participantContinue.BackColor = Color.Green
    participantContinue.ForeColor = Color.White
    participantContinue.Font = New Font(participantContinue.Font, FontStyle.Bold)
    participantContinue.Text = "Resume"
    participantContinue.Visible = False
    CenterPanel.Controls.Add(participantContinue)
    AddHandler participantContinue.Click, AddressOf Participant_Resume

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


    Dim storage As New StopwatchStorage()
    storage.Label = participantClock
    storage.Timer = participantTimer
    storage.Continuation = participantContinuation
    storage.Button = ParticipantStop
    storage.ParticipantContinueTimers = participantContinueTimers
    storage.ContinueBtn = participantContinue
    storage.ParticipantName = participantName
    storage.ParticipantOrder = participantLbl
    storage.Stopwatch = participantStopwatch
    _storage.Add(storage)
    AddHandler participantTimer.Tick, AddressOf Timer_Tick

End Sub


End Class
Public Class StopwatchStorage
Public Property Stopwatch As Stopwatch
Public Property Continuation As Stopwatch
Public Property ParticipantContinueTimers As TimeSpan
Public Property ParticipantName As TextBox
Public Property Label As Label
Public Property ParticipantOrder As Label
Public Property Timer As Timer
Public Property Button As Button
Public Property ContinueBtn As Button
End Class

Что должно произойти, так это то, что при нажатии кнопки Стоп должен запускаться другой таймер / секундомер. Когда вы нажимаете кнопку «Возобновить», значение секундомера должно быть добавлено обратно в таймер. (Он добавляется в `memberContinueTimers, который затем добавляется обратно в запущенный таймер.) Теперь код делает то, что должен делать, НО, вместо того, чтобы добавлять конкретный из этих остановленных часов, он добавляет ВСЕ значения остановленный щелчок затем сбрасывает.

Может кто-нибудь объяснить, как я могу заставить это работать так, чтобы добавлялся только ОДИН остановленный результат?

РЕДАКТИРОВАТЬ: Добавление в метод, в котором сделаны хранилища. Больше кода, и мне придется разместить его на SourceForge или Codeplex и работать там.

1 Ответ

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

Вы не должны использовать переменные-члены для ваших динамических элементов управления. На этом пути вы переопределяете все элементы управления, и выигрывает только последний. Вместо этого вы должны создать их в методе отдельно. Вы также используете параметр records, но я не вижу кода, в котором вы зациклили его, чтобы создать более одного StopwatchStorage.

Private Sub DrawControls(records As Integer)
    Dim participantLbl = New Label
    participantLbl.Location = New Point(5 + (((records - 1) \ 15) * 321), 5 + (((records - 1) Mod 15) * 26))
    participantLbl.Size = New Size(22, 20)
    participantLbl.TextAlign = ContentAlignment.MiddleCenter
    participantLbl.Text = records
    CenterPanel.Controls.Add(participantLbl)

    Dim participantName = New TextBox
    participantName.Location = New Point(31 + (((records - 1) \ 15) * 321), 5 + (((records - 1) Mod 15) * 26))
    participantName.Size = New Size(105, 20)
    CenterPanel.Controls.Add(participantName)

    Dim participantClock = New Label
    participantClock.Size = New Size(100, 20)
    participantClock.Name = "participantClock" & TotalParticipants
    participantClock.Location = New Point(139 + (((records - 1) \ 15) * 321), 5 + (((records - 1) Mod 15) * 26))
    participantClock.BorderStyle = BorderStyle.Fixed3D
    participantClock.TextAlign = ContentAlignment.MiddleRight
    CenterPanel.Controls.Add(participantClock)

    Dim ParticipantStop = New Button
    ParticipantStop.Size = New Size(63, 20)
    ParticipantStop.Location = New Point(245 + (((records - 1) \ 15) * 321), 5 + (((records - 1) Mod 15) * 26))
    ParticipantStop.BackColor = Color.Red
    ParticipantStop.ForeColor = Color.White
    ParticipantStop.Font = New Font(ParticipantStop.Font, FontStyle.Bold)
    ParticipantStop.Text = "Stop"
    CenterPanel.Controls.Add(ParticipantStop)
    AddHandler ParticipantStop.Click, AddressOf Participant_Stop


    Dim participantContinue = New Button
    participantContinue.Size = New Size(63, 20)
    participantContinue.Location = New Point(245 + (((records - 1) \ 15) * 321), 5 + (((records - 1) Mod 15) * 26))
    participantContinue.BackColor = Color.Green
    participantContinue.ForeColor = Color.White
    participantContinue.Font = New Font(participantContinue.Font, FontStyle.Bold)
    participantContinue.Text = "Resume"
    participantContinue.Visible = False
    CenterPanel.Controls.Add(participantContinue)
    AddHandler participantContinue.Click, AddressOf Participant_Resume

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


    Dim storage As New StopwatchStorage()
    storage.Label = participantClock
    storage.Timer = participantTimer
    storage.Continuation = participantContinuation
    storage.Button = ParticipantStop
    storage.ParticipantContinueTimers = participantContinueTimers
    storage.ContinueBtn = participantContinue
    storage.ParticipantName = participantName
    storage.ParticipantOrder = participantLbl
    storage.Stopwatch = participantStopwatch
    _storage.Add(storage)
    AddHandler participantTimer.Tick, AddressOf Timer_Tick
End Sub
...