【问题标题】:Collections and Variables集合和变量
【发布时间】:2012-02-09 15:45:31
【问题描述】:

我在 Visual Basic.net 中有一个集合(抱歉,如果人们第 90 亿次看到此代码......)

这是目前为止的代码:

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 上并从那里开始工作。

【问题讨论】:

  • 我不明白这个问题本身。您能否再解释一下:“它不是添加那个停止时钟的特定值,而是添加停止点击的所有值然后重置。”
  • 程序正在动态创建控件。制作了两个秒表。一个在创建时运行(例如 TimerA),一个在创建的停止时运行(Timer B)。应该发生的是,通过单击 Continue 按钮的出现,应该将 Timer B 的值添加回 Timer A,然后 Timer A 应该再次运行。这应该只发生在一个特定的计时器上。如果我创建 30 个计时器,停止其中的 29 个,然后尝试恢复这 29 个中的任何一个,而不是仅添加一个 TimerB 的值,而是将所有 TimerB 的值相加。
  • 您尚未展示如何创建这些 StopwatchStorage。所以也许你对导致这种行为的东西使用了相同的引用。
  • 编辑了(我认为)存储的制作方式。不知道我是否可以在不发布整个表单的情况下发布更多代码。

标签: vb.net visual-studio-2010 collections stopwatch


【解决方案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

【讨论】:

  • 我已经编辑了我的回复,以显示我是如何循环创建存储的。具体功能:StartButton_Click
  • @Paul:那我的回答能解决你的问题吗?正如我所说,您正在创建 n StopWatchStorages 但都引用相同的控件。
  • 不幸的是。我仍然有同样的问题。除非你的代码没有改变任何东西,否则它看起来还是我的。
  • 不,我在本地创建方法中的控件,例如:Dim participantLbl = New Label。您正在初始化在类范围内声明的实例变量,例如:participantLbl = New Label。您的代码将只使用一个引用(对于每个控件),我的将创建 n 具有不同引用的控件。
  • 好的,我现在看到了。但不,我仍然有相同的结果。那我应该去掉表格开头的声明吗?
猜你喜欢
  • 2020-10-25
  • 2020-12-14
  • 2021-08-04
  • 2017-12-17
  • 2014-02-09
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
相关资源
最近更新 更多