2016-11-07 93 views
2

我正在使用WinForm的。我的表單中有一個標籤,應該從0:20秒開始倒數。到0:00秒。我試圖在這裏做,但編譯器給我一個錯誤。時間跨度減秒錶倒計時

Error: Cannot convert from 'int' to 'System.TimeSpan'

爲什麼不能使用timespan.Subtract()?我怎麼能從0:20秒到0:00秒?

private void timer1_Tick(object sender, EventArgs e) 
    { 
     TimeSpan timespan = TimeSpan.FromSeconds(20); 

     Stopwatch stopwatch = new Stopwatch(); 
     stopwatch.Start(); 
     Time_label.Text = timespan.Subtract(stopwatch.Elapsed.Seconds); 
    } 
+2

請注意,'stopwatch.Elapsed.Seconds'只是秒*組件*,因此它從0到59計數,然後再次回滾到0。你可能想要'stopwatch.Elapsed.TotalSeconds'繼續計數59.除非你正在做一個公雞來展示,否則我發現很少有人真正需要'Seconds'而不是'TotalSeconds'。 – Quantic

+0

你不需要使用'StopWatch'。你只需要使用一個計時器,但是當你想啓動計時器時,首先計算'EndTime'或'StopTime',然後啓動計時器。在每個勾號中,您應該更新標籤的文本,並檢查您是否達到了結束時間,然後停止計時器並在標籤上顯示'00:00'。您可能會發現這篇文章有用:[顯示時間已過](https://stackoverflow.com/questions/38420596/display-time-elapsed) - 我相信這是一個確切的副本。 –

+1

你的事件不需要使用'TimeSpan',看看鏈接的帖子,並設置結束時間'endTime = DateTime.Now.AddSeconds(20);' –

回答

3

一個簡單的第二個計數器更好的方法是使用Timer本身。

private readonly Timer _timer;  
private TimeSpan _timespan; 
private readonly TimeSpan _oneSecond; 

public Form1() 
{ 
    InitializeComponent(); 

    _timer = new Timer(); 
    _timer.Tick += timer1_Tick; 
    _timer.Interval = 1000;  

    _timespan = TimeSpan.FromSeconds(20); 
    _oneSecond = new TimeSpan(0, 0, 0, 1); 

    _timer.Start(); 
} 

private void timer1_Tick(object sender, EventArgs eventArgs) 
{ 
    if (_timespan >= TimeSpan.Zero) 
    { 
     Time_label.Text = _timespan.ToString(@"m\:ss"); 
     _timespan = _timespan.Subtract(_oneSecond); 
    } 
    else 
    { 
     _timer.Stop(); 
    } 
} 
+0

我的標籤不會倒計時/或更新,雖然它停留在00:00:19秒 – taji01

+0

如果它說「00:00:19」您的代碼不會「正確複製」,因爲我的示例會說「0:20 「(根據您的預期結果)開始時。 – Jim

2

stopwatch.Elapsed.Seconds回報和int,具體地,秒數。 timespan.Subtract(TimeSpan)接受TimeSpan對象。

你可以試試:

Time_label.Text = 20 - stopwatch.Elapsed.Seconds; 

Time_label.Text = timespan.Subtract(stopwatch.Elapsed).Seconds; 

請注意有你的邏輯缺陷。每當您觸發滴答事件時,您都會重新啓動一個新的秒錶,因此每次觸發時都會有一個新的0:00秒錶,並且您將在文本框中顯示19或20。 在其他地方實例化您的秒錶,因此它在刻度之間是相同的。

編輯: 作爲由Quantic的評論所說,如果你打算具有比秒

Time_label.Text = (int)timespan.Subtract(stopwatch.Elapsed).TotalSeconds; 
+0

Upvote爲您的編輯添加其他實現。 stopwatch.Elapsed是一個時間跨度,它是時間跨度的參數。減少。不需要鑄造。 – Botonomous

+1

'.TotalSeconds'更安全。 '。Seconds'只是「Seconds組件」,只在0到59之間。 – Quantic

+0

@Quantic Nice,TotalSeconds也是double,比int32更精確。 – Botonomous

1

TimeSpan.Subtract一分鐘的價值更期望另一個時間跨度結構。 Stopwatch.Elapsed.Seconds是一個Int32結構。沒有任何內置的轉換將Int32轉換爲TimeSpan。你可以試試這個

Time_label.Text = timespan.Subtract(TimeSpan.FromSeconds(stopwatch.Elapsed.seconds)).ToString(); 
0

TimeSpan.Subtract期望你從中減去時間跨度的另一個實例(時間跨度本身不綁定到特定的時間單位,所以減去說「15」,它並不「知道「你想要什麼單位)。

你想要的是要麼

Time_label.Text = Timespan.Subtract(TimeSpan.FromSeconds(stopwatch.Elapsed.Seconds))); 

產生一個相當漂亮的預格式化

00:00:20 

或(服用的事實,秒錶的經過的是一個時間跨度自身優勢)

Time_label.Text = timespan.Subtract(stopwatch.Elapsed); 

但是,生產

00:00:19.9999765 

這可能太精確,無法顯示給最終用戶(這是由於秒錶精確無誤)。