集合和变量
我在 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
应该发生的情况是,单击停止按钮时应该启动另一个计时器/跑表。当您单击“恢复”按钮时,秒表的值应该被添加回正在运行的计时器。 (它被添加到“participantContinueTimers”,然后添加回正在运行的计时器。)现在代码正在执行它应该做的事情,但是,它不是添加那个停止时钟的特定值,而是添加了停止点击然后重置。
有人可以解释一下如何让它工作,以便只添加一个停止的结果吗?
编辑:添加存储的方法。如果有更多代码,我必须将其托管在 SourceForge 或 Codeplex 上并从那里开始工作。
I have a collection in Visual Basic.net (Sorry if people are seeing this code for the nine billionth time...)
Here's the code so far:
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
What's supposed to happen is that the Stop Button when clicked is supposed to start another timer/stopwatch. When you click the Resume Button, the value of the stopwatch is supposed to be added back onto the running timer. (It gets added to `participantContinueTimers which is then add back onto the running timer.) Now the code is doing what it's supposed to do, BUT, instead of adding the particular of that one stopped clock, it adds ALL of the values of the stopped click then resets.
Can someone explain how can I get this to work so that only the ONE stopped result is added on?
EDIT: Adding in the method in which the Storages are made. Any more code and I'll have to host it on SourceForge or Codeplex and work from there.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您不应将成员变量用于动态控件。通过这种方式,您将覆盖所有控件,只有最后一个获胜。相反,您应该在方法中单独创建它们。您还使用了参数
records
,但我没有看到循环它以创建多个StopwatchStorage
的代码。You should not use member variables for your dynamical controls. On this way you are overriding all controls and only the last one wins. Instead you should create them in the method separately. You are also using a parameter
records
, but i don't see the code where you loop it to create more than oneStopwatchStorage
.