2016-03-26 2 views
3

Это моя первая попытка изучения классов на любом языке. Я пытаюсь создать проект Windows Form, который является секундомерным. Я создал класс, у которого есть метод StartClock, который запускает секундомер, затем я помещаю прошедшее время в переменную времени. Затем я беру строку elapsedTime и устанавливаю ее равной форматированной строке с переменными временного диапазона. Код ниже.Передача значений из одного места в другое

public class CStopWatch 
{ 

    Stopwatch sw = new Stopwatch(); 

    private DateTime startTime; 

    private DateTime stopTime; 

    private String elapsedTime; 

    public String ElapsedTime 
    { 
     get 
     { 
      return elapsedTime; 
     } 


    } 

    public String StartClock() 
    { 

     sw.Start(); 
     TimeSpan ts = sw.Elapsed; 
     elapsedTime = String.Format("{0:00}:{1:00}:{2:00}", 
     ts.Hours, ts.Minutes, ts.Seconds/10); 
     return elapsedTime; 


    } 

    public void StopClock() 
    { 
     // sw.Stop(); 
    } 

} 

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

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

public partial class Form1 : Form 
{ 
    // string elapsedTime; 

    // public string elapsedTime { get { return elapsedTime; } } 

    CStopWatch sw = new CStopWatch(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void lblTime_Click(object sender, EventArgs e) 
    { 

    } 


    private void btnStart_Click(object sender, EventArgs e) 
    { 
     timer.Enabled = true; 
     sw.StartClock(); 
     timer.Interval = 1000; 

     //Testing without using classes 
     /* 
     timer.Enabled = true; 
     sw.Start(); 
     timer.Interval = 1000; 
     TimeSpan ts = sw.Elapsed; 
     string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}", 
     ts.Hours, ts.Minutes, ts.Seconds/10); 
     */ 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void timer_Tick(object sender, EventArgs e) 
    { 

     lblTime.Text = sw.ElapsedTime; 


    } 
} 

Я уверен, что я пропускаю что-то или делать что-то глупое, но все мои Google фу не привела меня к ответу еще. Заранее спасибо.

+0

Когда вы говорите, что этикетка не меняется, имеет ли она значение вообще? или имеет начальное значение, но значение не обновляется? –

+0

У меня есть свойство текста ярлыка, установленное на 00:00:00 –

ответ

3

Вы назначаете значение переменной elapsedTime только один раз после нажатия кнопки «Пуск». Позже вы попытаетесь прочитать значение из него (используя свойство ElapsedTime) в методе timer_Tick, однако вы не назначаете новое значение. Попробуйте что-то вроде этого:

public String ElapsedTime 
    { 
     get 
     { 
      TimeSpan ts = sw.Elapsed; 
      return String.Format("{0:00}:{1:00}:{2:00}", 
     ts.Hours, ts.Minutes, ts.Seconds/10); 
     } 
    } 
+0

Спасибо! Я изменил свой код в своем классе ниже, но он все еще не обновляется. 'public String ElapsedTime { получает { TimeSpan ts = sw.Elapsed; return String.Format ("{0:00}: {1:00}: {2:00}", ts.Hours, ts.Minutes, ts.Seconds/10); }} общественного недействительный StartClock() { sw.Start(); } ' –

+0

Вызывается функция« timer_Tick »вообще? :) Если да, посмотрите на d.moncada anserw. Это может быть проблема с другим потоком, пытающимся обновить ваш графический интерфейс. Имейте в виду, что только GUI-поток может изменять компоненты GUI. – Valker

+0

Gotcha! Еще раз спасибо! –

0

this выписки, я думаю, что это событие клеща таймера происходит в другом потоке, что не позволило обновить пользовательский интерфейс, ссылка показывает решения зависит от того, какую версии .net вы используете.

0

попробуйте следующее

timer.Elapsed += OnTimedEvent; 
timer.Interval = 1000; 
timer.Enabled = true; 
sw.StartClock(); 

Добавьте следующий метод:

private static void OnTimedEvent(Object source, ElapsedEventArgs e) 
    { 
     lblTime.Text = string.Format("{0:HH:mm:ss.fff}",e.SignalTime); 
    } 
1

Это происходит потому, что ElapsedTime устанавливается один раз, то никогда не обновляется.

public String ElapsedTime 
{ 
    get 
    { 
     return String.Format("{0:00}:{1:00}:{2:00}", sw.Elapsed); 
    } 
} 

Это должно исправить это. Так ElapsedTime декларация и инициализация не являются полезными и могут быть удалены:

public class CStopWatch 
{ 
    Stopwatch sw = new Stopwatch(); 

    public String ElapsedTime 
    { 
     get 
     { 
      return String.Format("{0:00}:{1:00}:{2:00}", sw.Elapsed); 
     }    
    } 

    public void StartClock() 
    { 
     sw.Start(); 
    } 

    public void StopClock() 
    { 
     sw.Stop(); 
    } 
} 
0

Проблема заключается в том, что вы на самом деле не обновить elapsedTime переменную. Вместо этого вы можете использовать Stopwatch в ElapsedTime недвижимость:

public String ElapsedTime 
{ 
    get 
    { 
     return string.Format("{0:00}:{1:00}:{2:00}", sw.Elapsed.Hours, sw.Elapsed.Minutes, sw.Elapsed.Seconds/10); 
    } 
} 

или, что эквивалентно (C# 6.0):

public String ElapsedTime => $"{sw.Elapsed.Hours:00}:{sw.Elapsed.Minutes:00}:{sw.Elapsed.Seconds/10:00}"; 
1

Я считаю, что есть некоторые проблемы с вашей текущей реализации. Обновите код кода WinForms так, чтобы StartClock произошел после установки Interval. Кроме того, если Timer происходит в другом потоке, вы должны указать Invoke элемент управления. Наконец, вам нужно обновить ElapsedTime всякий раз, когда появляется Tick.

public partial class Form1 : Form 
{ 
    CStopWatch sw = new CStopWatch(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void btnStart_Click(object sender, EventArgs e) 
    { 
     timer.Interval = 1000; 
     timer.Enabled = true; 

     lblTime.Text = sw.StartClock(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void timer_Tick(object sender, EventArgs e) 
    { 
     UpdateElapsedTime(); 

     if (lblTime.InvokeRequired) 
     { 
      lblTime.Invoke(new MethodInvoker(() => 
      { 
       lblTime.Text = sw.ElapsedTime; 
      })); 
     } 
    } 
} 

Затем вы можете обновить свой класс CStopWatch иметь следующее UpdateElapsedTime метод.

public class CStopWatch 
{ 
    private Stopwatch sw = new Stopwatch(); 
    private DateTime startTime; 
    private DateTime stopTime; 
    private String elapsedTime; 

    public String ElapsedTime 
    { 
     get 
     { 
      return elapsedTime; 
     } 
    } 

    public String StartClock() 
    { 
     sw.Start(); 

     UpdateElapsedTime(); 

     return ElapsedTime; 
    } 

    public void UpdateElapsedTime() 
    { 
     TimeSpan ts = sw.Elapsed; 
     ElapsedTime = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds/10); 
    } 

    public void StopClock() 
    { 
     sw.Stop(); 
    } 
} 
Смежные вопросы