2013-12-20 2 views
5

Привет, У меня возникла проблема при сбросе настроек таймера в приложении для получения формы C#.Таймер не сбрасывается в C#

Я разрабатываю простой таймер обратного отсчета.

Sample

Когда я нажимаю на start он начинает обратный отсчет от 59 секунд. Мне нужно, чтобы таймер должен был перезагрузиться с начала, когда я нажимаю кнопку Start.

код на timer1_tick

if (hours==0 && minutes==0 && seconds==0) 
{ 
    hours = 0; 
    minutes = 1; 
    seconds = 0; 
} 
else 
{ 
    if (seconds < 1) 
    { 
     seconds = 59; 
     if (minutes == 0) 
     { 
      minutes = 59; 
      if (hours != 0) 
       hours -= 1; 
     } 
     else 
     { 
      minutes -= 1; 
     } 
    } 
    else 
     seconds -= 1; 

    lblTime.Text = hours + @":" + minutes + @":" + seconds; 
} 

и код на btnStart_Click

timer1.Enabled = false; 
timer1.Enabled = true; 

Здесь я пытаюсь перезагрузить timer1 путем включения и выключения control, но это не работает. Я также попытался проверить с

timer1.Stop(); 
timer1.Start(); 

, но он начинает снова, откуда он был сутулый.

Как мы можем решить это?

+0

BTW: Я просто подсчитывают от 0 до вашего начального временного интервала в секундах и отображения (начального - текущего) секунд в вашей форме, поэтому вам не нужно «подсчитывать» назад, что сэкономит много кода. – Robert

+1

Использовать 'TimeSpan' сделать жизнь простой –

ответ

3

Я предлагаю вам хранить DateTime значение, которое будет представлять целевое время (текущее время плюс одна минута):

// or DateTime.Now.AddMinutes(1) 
targetTime = DateTime.Now.Add(TimeSpan.FromMinutes(1)); 

Затем на каждом тике таймера вычитать текущее время от заданного времени и отображения TimeSpan вы будете иметь:

var span = targetTime - DateTime.Now; 

if (span.TotalSeconds > 0) 
    lblTime.Text = span.ToString(@"hh\:mm\:ss"); 
else 
    lblTime.Text = "Bingo!"; 

Таким образом, вам не нужно хранить и поддерживать три переменные в течение нескольких часов, минут и секунд.

+1

+1 Или вы можете просто использовать 'TimeSpan' –

1

Использование

timer1.Dispose(); 
timer1 = new System.Windows.Forms.Timer(); 

Чтобы избавиться от объекта и переинициализации.

Надеюсь, это поможет.

+0

нет такой функции..Извините, что это не сработает. –

+0

Извините, неправильный класс! Я обновил ответ ... – MoonKnight

2

в вашем btnStart_Click вы должны сбросить вашего переменного экземпляр

hours=minutes=seconds=59 
+0

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

2

Где hours, minutes и seconds определены?

Похоже, что ваш btnStart_Click просто должен сбросить эти значения вместо сброса таймера.

Не могу сказать из вашего вопроса, каковы должны быть эти значения по умолчанию. Вы говорите, что таймер должен отсчет времени от 59 секунд, но затем я вижу логику, которая сбрасывает минуты до 59 и другую логику, которая уменьшает час (хотя час начинается с 0 и никогда не увеличивается).

+0

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

1
if (timer1.Enabled) { timer1.Enabled = false; } 
else { minutes = 1; seconds = 0; timer1.Enabled = true; } 

, если вы хотите сбросить обратно на 1 минуту, сделать это в вашей btnStart_Click функции

Примечание: для seconds, когда он стал 0 будет снова увеличить до 59, хотя ваш minutes 0, вы должны проверить его

if (minutes == 0 && seconds == 0) 
{ 
    timer1.Enabled = false; 
    //this your code to reset variable hours, minutes, and seconds 
} 

использовать эту функцию в функции timer1_tick()

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