2016-11-07 8 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

簡単な第2のカウンタのより良いアプローチは、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; 

をあなたのロジックに欠陥があるますのでご注意ください。ティックイベントを発生させるたびに新しいストップウォッチを再開するので、毎回新しいゼロストップウォッチがあり、テキストボックスに19または20が表示されます。 ストップウォッチを他の場所でインスタンシエートするので、ティックの間で同じです。

EDIT: あなたは秒

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

Upvoteは他の実装を追加します。 stopwatch.Elapsedはtimespan.Subtractのパラメータであるタイムパンです。キャスティングは必要ありません。 – Botonomous

+1

'.TotalSeconds'はより安全です。 '.Seconds'は" Seconds component "のみで、0から59までです。 – Quantic

+0

@Quantic Nice、TotalSecondsもdoubleでint32よりも正確です。 @Quantic True。 – Botonomous

1

TimeSpan.Subtractの分の価値以上のものを持つことを計画している場合、Quanticのさんのコメントによって提案されたように、別のTimeSpan構造体を期待しています。 Stopwatch.Elapsed.SecondsはInt32構造体です。 Int32をTimeSpanに変換するための暗黙の変換は組み込まれていません。あなたはこの

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

TimeSpan.Subtractを減算することによって、それは「知らない「15」と言うように、あなたは、自分自身でのTimeSpanは、特定の時間単位にバインドされていない(それからのTimeSpanの別のインスタンスを引くことを期待してみてください"あなたが何を持っているか)。

何がしたいことはどちらかという気の利いたフォーマット済み

00:00:20 

または(ストップウォッチの経過がのTimeSpanそのものであるという事実を利用して)

Time_label.Text = timespan.Subtract(stopwatch.Elapsed); 
を生成

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

です

しかし、それは

00:00:19.9999765 

エンドユーザーに表示するには高すぎる可能性があります(これは、ストップウォッチが正確に正確に表示されているためです)。