2016-03-26 48 views
3

這是我第一次嘗試以任何語言學習課程。我正在嘗試創建一個停止監視的Windows窗體項目。我創建了一個具有啓動秒錶的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方法,然後我的時間間隔設置爲每一秒。

在我的計時器滴答事件中,我設置我的標籤以顯示經過時間字符串變量。當我運行這個時,我不會有任何錯誤,但標籤不會改變。以下是我的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; 


    } 
} 

我敢肯定,我失去了一些東西或做一些愚蠢的事,但我所有的谷歌賦還沒有導致我的答案。提前致謝。

+0

當你說標籤沒有改變,它有沒有值?還是它有一個初始值,但價值沒有得到更新? –

+0

我將標籤的文本屬性設置爲00:00:00 –

回答

3

單擊「開始」按鈕後,您只能指定一次變量elapsedTime的值。稍後,您嘗試在timer_Tick方法中讀取它的值(使用ElapsedTime屬性),但不要分配新值。嘗試是這樣的:

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 { get { TimeSpan ts = sw.Elapsed; return String.Format(「{0:00}:{1:00}:{2:00}」, ts.Hours,ts.Minutes,ts.Seconds/10); } } public void StartClock() { sw.Start(); }' –

+0

「timer_Tick」函數是否被調用? :)如果是的話,看看d.moncada anserw。它可能是另一個線程嘗試更新GUI的問題。請注意,只有GUI線程才能修改GUI組件。 – Valker

+0

哎!再次感謝! –

0

退房this,我認爲發生在另一個線程的計時器滴答事件,即不允許更新UI,鏈接顯示的解決方案取決於您所使用的.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變量。你可以改用你的StopwatchElapsedTime屬性:

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代碼隱藏,以便在設置Interval後發生StartClock。此外,如果Timer正在另一個線程上發生,您將需要Invoke控制權。最後,只要Tick發生,您就需要更新ElapsedTime

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(); 
    } 
} 
相關問題