我正在尝试创建一个从指定时间倒计时的计时器。
用户输入时间并单击按钮
按钮单击打开第二个表单,其中包含一个计时器
每次计时器滴答时,时间减少,剩余时间显示在form2(textbox.text = timeLeft
)上的文本框中。
但是,文本框永远不会实际更新。它仍然是空白的,并且唯一一次为.text
属性分配新值将实际起作用的是我是否引发了一个事件(例如,单击一个将改变.text属性的按钮>文本框)
*这是计时器类的代码
Public Class CountdownTimer
Private timeAtStart As Integer
Private timeLeft As Integer
Public Sub StartTimer(ByVal time As Integer)
timeAtStart = time
timeLeft = timeAtStart
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If timeLeft > 0 Then
timeLeft = timeLeft - 1
txtTimeLeft.Text = timeLeft.ToString
Else
Timer1.Stop()
txtTimeRemaining.Text = "Time!"
txtTimeRemaining.ForeColor = Color.Red
End If
End Sub
End Class
以下是我的称呼方式:
Dim timer As New CountdownTimer
timer.Show()
CountdownTimer.StartTimer(CInt(txtSetTime.Text))
答案 0 :(得分:2)
您的代码正在调用(表单)类而不是实例,并且我无法看到Timer1在独立的可重用类中被正确引用的位置。以下是实现与其他表单一起使用的CountDown类的一种方法....
Friend Class CountdownTimer
Private timeAtStart As Integer
Private timeLeft As Integer
Private WithEvents Timer1 As New Timer
Private txtTimeLeft as TextBox
Public Sub New(TargetTB as TextBox)
txtTimeLeft= TargetTB
End Sub
Public Sub StartTimer(ByVal time As Integer, timeLength as Integer)
timeAtStart = time
timeLeft = timeLength
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs)_
Handles Timer1.Tick
' just dislaying time left
If timeLeft > 0 Then
timeLeft = timeLeft - 1
txtTimeLeft.Text = timeLeft.ToString
Else
Timer1.Stop()
txtTimeLeft.Text = "Time!"
txtTimeLeft.ForeColor = Color.Red
End If
End Sub
End Class
如何使用它:
Dim CountDn As New CountdownTimer(frm.TextBoxToUse)
' use the INSTANCE name not the class name!!!!
'CountdownTimer.StartTimer(CInt(txtSetTime.Text))
CountDn.StartTimer(CInt(txtSetTime.Text))
答案 1 :(得分:0)
如果在计时器完成后显示结果,我认为你应该使用
Application.DoEvents()
立即查看更新的方法。它实际上适用于Windows窗体。你有什么尝试,所以我可以进一步帮助
答案 2 :(得分:0)
您确实意识到,当您倒计时时,您设置的文本框与完成时不同,对吧?
txtTimeLeft.Text
VS
txtTimeRemaining.Text
注意:定时器在与UI相同的线程上运行,因此如果您的计算机(或程序)变忙,计时器将不会按照确切的时间间隔进行计时。如果您担心计时器的微小差异,您应该比较每个计时事件期间计算机时间的差异,以确定已经过了多长时间。
Dim TS = TimeSpan = Now.Subtract(StartingTime)
答案 3 :(得分:0)
每次更新后尝试刷新文本框:
所以
之后txtTimeLeft.Text = timeLeft.ToString
添加
txtTimeLeft.Refresh
答案 4 :(得分:0)
这是你的问题:
Dim timer As New CountdownTimer
timer.Show()
CountdownTimer.StartTimer(CInt(txtSetTime.Text))
您实例化一个名为timer
的新对象,但随后在CountdownTimer
对象上启动计时器
您需要将代码更改为:
Dim timer As New CountdownTimer
timer.Show()
timer.StartTimer(CInt(txtSetTime.Text))