2012-02-09 3 views
0

У меня есть коллекция в 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 

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

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

EDIT: добавление метода, в котором хранятся хранилища. Любой другой код, и мне придется разместить его на SourceForge или Codeplex и работать оттуда.

+0

Я не понял самого вопроса. Можете ли вы объяснить следующий бит больше: «вместо того, чтобы добавлять конкретный из этих остановленных часов, он добавляет ВСЕ значения остановленного клика, а затем сбрасывает». –

+0

Программа динамически создает элементы управления. Сделаны два секундомера. Один работает при создании (например, TimerA), и один запускается, когда созданный останавливается (Timer B). Предполагается, что при нажатии кнопки «Продолжить» значение Timer B должно быть добавлено обратно на Таймер A, а затем на Таймер A, который должен снова запускаться. Это должно произойти только для ОДНОГО конкретного таймера. Если я сделаю 30 таймеров, остановите 29 из них, а затем попытайтесь возобновить любой из этих 29, вместо того, чтобы просто добавить значение одного TimerB, вместо этого он добавляет ВСЕ из TimerB. –

+0

Вы не показали, как вы создаете эти StopwatchStorages. Поэтому, возможно, вы используете те же ссылки для чего-то, что вызывает такое поведение. –

ответ

1

Вы не должны использовать переменные-члены для своих динамических элементов управления. Таким образом, вы управляете всеми элементами управления, и выигрывает только последний. Вместо этого вы должны создать их в методе отдельно. Вы также используете параметр 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 
+0

Я отредактировал свой ответ, чтобы показать, как я зацикливаюсь, чтобы создать хранилища. Speicifcally функция: StartButton_Click –

+0

@Paul: Так мой ответ решает вашу проблему? Как я уже сказал, вы создаете 'n' StopWatchStorages, но все ссылаетесь на те же элементы управления. –

+0

Не к сожалению. У меня все еще такая же проблема. Если ваш код ничего не изменит, он выглядит как мой. –

Смежные вопросы