编程vb.net,第二种形式的文本框不会更新

时间:2013-10-11 13:23:07

标签: vb.net textbox

我正在尝试创建一个从指定时间倒计时的计时器。

用户输入时间并单击按钮 按钮单击打开第二个表单,其中包含一个计时器 每次计时器滴答时,时间减少,剩余时间显示在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))
    

5 个答案:

答案 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))