2012-02-07 8 views
2

小さなウィンドウフォームアプリケーションには2つのラジオボタンがあり、最初はどちらもチェックされていません。そのうちの1つがチェックされるまで、「実行」ボタンを無効にする必要があります。WinFormsフォームのタイマーコンポーネントを使用してラジオボタンの状態を確認し、ボタンを有効/無効にすることはできますか?

私はこれを得るための非常に簡単な方法を見つけましたが、ランダムなクラッシュのために自分自身を設定しているかどうかはわかりません。

が、私はそれを可能にし、タイマーコンポーネントを追加し、Tickイベントに:この方法が有効かどうか、私は「場合

private void timer1_Tick(object sender, EventArgs e) 
{ 
    bool canGo = (_usRadioButton.Checked || _intlRadioButton.Checked); 
    if (_goButton.Enabled != canGo) 
    { 
     _goButton.Enabled = canGo; 
    } 
} 

私はこれを行うには、他の方法がある知っている、私は好奇心が強いですフォームがチェックボックスのいずれかでCheckedプロパティを更新していると同時に、タイマーが起動しているときにエンドユーザーが例外をスローすることになりますか?

答えて

2

あなたが正しく理解していれば、既にCheckedChangedイベントについて知っており、コード内の競合についてのみ質問しています。したがって:

私が知る限り、それはマルチスレッドではなく、危険はありません。 Tickイベントは、コンピュータがChecked状態を更新すると同時に実際には起動しません。あなたはForm.LoadとTimer.Tickでトレースを配置する場合

private void Form_Load(object sender, EventArgs e) 
{ 
    Console.WriteLine("Form_Load/Thread.CurrentThread.ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId); 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Console.WriteLine("timer1_Tick/Thread.CurrentThread.ManagedThreadId=" + Thread.CurrentThread.ManagedThreadId); 
} 

結果は:

Form_Load/Thread.CurrentThread.ManagedThreadId=9 
timer1_Tick/Thread.CurrentThread.ManagedThreadId=9 
+0

OK、Tickイベントがフォームのスレッドにあると言っています。これはおそらく質問していたはずの質問です(私はそれを考えていました)。 –

+0

はい。しかし、それは「私が知る限り」だけです。おそらく、[Skeet](http://stackoverflow.com/users/22656/jon-skeet)または[Hans](http://stackoverflow.com/users/17034/hans-passant)を待つ方が良いでしょう。それは確かに答えてください。 – ispiro

+0

+1勇気のために+1 –

2

もっと良い解決策は、ラジオボタンのCheckedChangedイベントを購読して、そのイベントハンドラの「実行」ボタンを有効にすることです。

この方法で発生するタイミングの問題を解決します。

+0

おかげで、あなたは私にはそれがそのように同じコードだ実感しました - しかし、やりますあなたはそこに「脱結合した」ことが少ないと同意しますか?私はそれについて間違っている可能性があります... –

+0

@ Gabriel - 私は "結合性"はいずれのアプローチでも同じだと思います。ボタンの有効状態を設定するには、ラジオボタンの値を読み取る必要があります。 – ChrisF

+0

私はCheckedプロパティについても考えていなかったので、これは私にとって良い見通しです。タイマーのTickイベントよりも悪い2つのラジオボタンのCheckChangedイベントへのサブスクリプションと、タイマーフォームとの直接の関係はありません...おそらく私の欠陥はイベントを「カップリング」要因とみなしているかもしれません。 –

1

私はそれがより安全であるとは確信していませんが、CheckedChangedイベントを購読して、そのハンドラコードを使用して「実行」ボタンを有効にすることもできます。これは無期限に実行するタイマーを節約します。

+0

Ahh..too slow again ... –

関連する問題