2013-12-13 2 views
0

Я хочу, чтобы таймер запускался в форме, значение которой было получено из базы данных. например, когда я сохраняю значение таймера в переменной, я умножаю его на 60000 для преобразования миллисекунд в минуты. Вот код:Как запустить этот таймер в vb.net?

Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

Dim x as integer 
details = ds.Tables(0).Rows(0).Item("Time") 
    Timer1.Interval =details * 60000 
    Timer1.Enabled = True 
End Sub() 

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    seconds.Text = x.ToString 
    If x= 0 Then 
     Timer1.Enabled = False 
     MessageBox.Show("You didn't finish in time.", "Sorry") 
     Me.Close() 
    Else 
     x-= 1 
    End If 
End Sub 

Когда я запускаю этот код, таймер работает в фоновом режиме и, когда время вышло, форма закрывается. Но он не отображается в метке секунд, когда таймер тикает. Надеюсь, вы поняли, что я имею в виду :)

+0

клещ происходит только один раз каждые 60 секунд, следовательно, метка обновляется каждые 60 секунд, в коде выше. – JaggenSWE

ответ

2

Если вы хотите, чтобы метка указывала секунды до 0, вам нужно, чтобы интервал таймера составлял 1000, независимо от того, как долго вы хотите это выполнить.

Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    details = ds.Tables(0).Rows(0).Item("Time") 
    Timer1.Interval =1000 
    endTime = DateTime.Now.AddMinutes(details) 
    Timer1.Enabled = True 
End Sub() 
Dim endTime As DateTime 

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick  
    If DateTime.Now > endTime Then 
     Timer1.Enabled = False 
     MessageBox.Show("You didn't finish in time.", "Sorry") 
     Me.Close() 
    Else 
     Seconds.Text = (DateTime.Now - endTime).ToString("hh\:mm\:ss") 
    End If 
End Sub 
+0

спасибо ... он работает как секундомер. Но тогда, а не большое значение секундного тикания, как я могу сделать его более удобным для пользователя или, скорее, выглядеть хорошо? – JasonBourne

+1

Для простоты я бы рекомендовал использовать объект «Секундомер» для отслеживания общего истекшего времени. –

+0

@ user3046786, Чтобы форматировать текст по-другому, не используйте 'TotalSeconds.ToString'. Используйте метод 'ToString' объекта' TimeSpan', который позволяет вам указать формат. См. [Эту страницу MSDN] (http://msdn.microsoft.com/en-us/library/dd992632 (v = vs.110) .aspx) для получения дополнительной информации о форматировании 'TimeSpan'. –

0

Это происходит потому, что ваш таймер тикает на Minutes интервале. Если вы хотите, чтобы показать секунды в ярлыке, то ваш таймер должен тикать в течение 1-секундного интервала (возможно, несколько миллисекунд, и т.д.)

Так вместо установки Timer1.Interval =details * 60000, установите x = details * 60 и Timer1.Interval до 1000.

Существует также variable scoping проблема с вашим кодом. Вы указали x как локальную переменную внутри Form1_Load, что означает, что она не будет доступна внутри Timer1_Tick. Переместите его вне процедуры.

Dim x As Integer 

Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Details = ds.Tables(0).Rows(0).Item("Time") 
    Timer1.Interval = 1000 
    x = Details * 60 
    Timer1.Enabled = True 
End Sub 

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    seconds.Text = x.ToString 
    If x = 0 Then 
     Timer1.Enabled = False 
     MessageBox.Show("You didn't finish in time.", "Sorry") 
     Me.Close() 
    Else 
     x-= 1 
    End If 
End Sub 

ОБНОВЛЕНО

Это при условии, что ваша база данных сохраненное значение в миллисекундах. В противном случае измените его соответствующим образом.

Dim ticker As TimeSpan 

Public Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load 
    Details = ds.Tables(0).Rows(0).Item("Time") 
    Timer1.Interval = 1000 
    ticker = TimeSpan.FromMilliseconds(Details) 
    Timer1.Enabled = True 
End Sub 

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick 
    seconds.Text = String.Format("{0:00}:{1:00}:{2:00}", ticker.Hours, ticker.Minutes, ticker.Seconds) 

    If ticker.Ticks <= 0 Then 
     Timer1.Enabled = False 
     MessageBox.Show("You didn't finish in time.", "Sorry") 
     Me.Close() 
    Else 
     ticker = ticker.Subtract(TimeSpan.FromSeconds(1)) 
    End If 
End Sub 
+0

Таймер, который он написал, не делал _not_ галочку на интервале минут. Он будет указывать точно _once_, когда время закончилось. –

+0

@Pradeep Kumar: спасибо ... он работает как секундный тик. Но тогда, а не большое значение секундного тикания, как я могу сделать его более удобным для пользователя или, скорее, выглядеть хорошо. – JasonBourne

+0

@JoelCoehoorn: это было именно то, что происходило – JasonBourne

0

Это не может быть полностью то, что вы можете, как я не конвертировать время или что-то я только что сделал это в качестве основных, как possiable и таким образом, вы должны быть в состоянии работать с ним :)

Public Class Form1 
    Dim Time As Integer = 100 'Your time in seconds goes here! 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     lblTime.Text = Time 
     Timer1.Enabled = True 

    End Sub 

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    Time = Time - 1 
    lblTime.Text = Time 

    If Time = 0 Then 
     Timer1.Enabled = False 
     MsgBox("You didn't finish in time.", "Sorry") 
     Me.Close() 
     End If 
    End Sub 
End Class 

Любые проблемы только сообщение мне

+0

Я протестировал код, и он работает для меня, кстати, – nfell2009

+0

спасибо, но более ранний ответ был отмечен как ответ. :) – JasonBourne

Смежные вопросы