2012-07-15 118 views
20

私の質問は重複したものではありません。ラジオボタンが変更されたイベントの変更を2回確認しました

Windowsフォームには3つのラジオボタンがあり、これらのボタンには共通の「CheckedChanged」イベントが関連付けられています。これらのラジオボタンのいずれかをクリックすると、「CheckedChanged」イベントが2回トリガーされます。

private void radioButtons_CheckedChanged(object sender, EventArgs e) 
{ 
    //My Code 
} 

が、私は二回、このイベントが繰り返さ内のブレークポイントと全体のコードを挿入:

は、ここに私のコードです。 なぜこのように動作しているのか教えてください。

+1

あなたの質問には、すでに回答済みです投稿を参照してくださいhttp://stackoverflow.com/questions/8050296/asp-net-4-0-radio-button-checked-changed-event-fires-only-once – HatSoft

+1

あなたのリンクされている答えこの質問に関連しています。 –

答えて

45

をトリガーですグループ内の1つのRadioButtonがチェックされるたびに、別のRadioButtonがチェックされなくなるため、チェックされた変更されたイベントは2回発生するため、イベントは2回発生します。あなたは、各ラジオボタンのための真の自動チェックプロパティを設定することができ

void radioButtons_CheckedChanged(object sender, EventArgs e) 
{ 
    RadioButton rb = sender as RadioButton; 
    if (rb != null) 
    { 
     if (rb.Checked) 
     { 
      // Only one radio button will be checked 
      Console.WriteLine("Changed: " + rb.Name); 
     } 
    } 
} 
+1

if(rb!= null)が不要な場合は薄くしないでください。 –

+2

@MuhammadAliDildarここでは、null参照例外が発生する可能性を避けることができます。もちろん、すべてのイベントを配線しているので、このイベントハンドラはラジオボタンにのみ添付されますが、 'ベストプラクティス'のやり方物事は、キャストが働いたことを確認することです。その後、イベントハンドラを間違ってアタッチしたときに例外をスローするという特定の観点から、コードを修正できるようにすることが望ましいかもしれません。 –

+0

ありがとうございました。それは私の問題を解決しました。 –

3

CheckedChangedは、Checkedプロパティが変更されるたびに発生します。 RadioButtonを選択すると、前に選択されたRadioButtonがチェックされず(CheckedChangedが発生)、新しいRadioButtonがチェックされます(CheckedChangedが発生します)。

2

他の回答者が正しく言うようにそれは、(つまり、チェックされた状態に変化がイベントをトリガー)未チェックにチェックして、再度未チェックの確認にあるラジオボタン移行のためのラジオボタンの移行のために一度

0

:だけちょうどこのような何かをやって、あなたが送信者のオブジェクトを見ることができ、選択されたRadioButtonのために、このイベント内の任意の仕事をするために

CheckChangedイベントの代わりにClickイベントをキャッチします。これにより、1つのイベントだけが起動され、ハンドラのロジックは、クリックを処理するために必要な場合に送信者をタイプしてRadioButtonにキャストできます。ハンドラロジックがシンプルな場合は、しばしばキャストを避けることができます。 radioButtonは、例えば

をチェックされているかどうかを確認だけで、それを避けるために

 private void rbText_Click(object sender, EventArgs e) 
    { 
     flowLayoutPanelTextNumeric.Enabled = rbTextNumeric.Checked; 
     txtBoxTextFixed.Enabled = rbTextFixed.Checked; 
     flowLayoutPanelTextFromFile.Enabled = rbTextFromFile.Checked; 
    } 
0
{ 
    public partial class Form3 : Form 
    { 
     public Form3() 
     { 
      InitializeComponent(); 
     } 
     int click = 0; 
     private void radioButton1_Click(object sender, EventArgs e) 
     { 
      click++; 
      if (click %2==1) 
      { 
       radioButton1.Checked = true; 
      } 
      if (click %2==0) 
      { 
       radioButton1.Checked = false; 
      } 
      if (radioButton1.Checked==true) 
      { 
       label1.Text = "Cheked"; 
      } 
      if (radioButton1.Checked==false) 
      { 
       label1.Text = "Uncheked"; 
      } 
     } 

    } 
} 
+1

上記のコードの説明を追加する必要がありますか? – davidkonrad

+0

@davidkonrad * real *コードは決して説明を必要としません!ドー! –

0

:ここでは3つのコントロール、rbTextNumeric、rbTextFixedとrbTextFromFileを扱う例です

private void radioButton1_CheckedChanged(object sender, EventArgs e) 
{ 
    if (radioButton1.Checked == true) 
     //your code 
} 
関連する問題