Bernoulli Lizard
Bernoulli Lizard

Reputation: 579

programing vb.net, Textbox in second form will not update

I am trying to create a timer that will countdown from the specified time.

The user enters a time and clicks a button.
The button click opens a second form that has a timer in it.
Every time the timer ticks, the time decreases and the time left is displayed in a textbox on form2 (textbox.text = timeLeft).

However, the textbox will never actually update. It remains blank, and the only time that assigning a new value to the .text property will actually work is if I raise an event (for example clicking a button that will change the .text property of the textbox)

*Here is the code for the timer class

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

Upvotes: 0

Views: 1568

Answers (5)

Matt Wilko
Matt Wilko

Reputation: 27342

This is your problem:

Dim timer As New CountdownTimer
timer.Show()
CountdownTimer.StartTimer(CInt(txtSetTime.Text))

You instantiate a new object called timer, but then start the timer on the CountdownTimer object

You need to change your code to this:

Dim timer As New CountdownTimer
timer.Show()
timer.StartTimer(CInt(txtSetTime.Text))

Upvotes: 0

Your code is calling the (form) class not the instance, and I cant see where Timer1 is properly referenced for an independant reusable class. Here is one way to implement a CountDown class that will work with other forms....

 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

How to use it:

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

Upvotes: 2

Matt Wilko
Matt Wilko

Reputation: 27342

Try refreshing the text boxes after each update:

So after

txtTimeLeft.Text = timeLeft.ToString

Add

txtTimeLeft.Refresh

Upvotes: 0

Steve
Steve

Reputation: 5545

You do realize that when you are counting down you are setting a different textbox than when it is complete, right?

txtTimeLeft.Text 

VS

txtTimeRemaining.Text 

Note: Timers run on the same thread as the UI so if you computer (or program) gets busy, the timer will NOT tick at exact intervals. If you are worried about small variances in your timer, you should compare the difference of your computer time during each tick event to determine how much time had passed.

Dim TS = TimeSpan = Now.Subtract(StartingTime)

Upvotes: 0

Jeswills
Jeswills

Reputation: 357

If it displays the result after the timer has completed, i think you should use the

Application.DoEvents()

method to see the update immediately. It actually works with Windows Forms. What have you tried, so i can help further

Upvotes: 0

Related Questions