2016-04-25 22 views
2

Windowsフォームに複数のグループボックスがあり、番号ピッカー&のコンボボックスがあります。チェックボックスが選択されていない場合は、他の要素を無効にします。私はロード時にチェックボックス以外のすべてを無効にして、CheckedChangedイベントのコード化された 'if/else'条件をすべて満たしています。しかし、いくつかのグループボックスは、以前のフォームの別の条件に依存しています。したがって、ユーザーがそのチェックボックスを選択しようとしたが、条件が有効でない場合は、メッセージを表示し、チェックボックスのチェックを外し、グループボックス内の他の要素を無効にして、ユーザーが戻って条件を変更するまで受け入れるか、彼らがいるように物事を進める。メッセージボックスが2回表示されていることを除いて、すべて正常に動作します(つまり、表示、キャンセル、再表示...)。無効にすると、メッセージは一度しか示され、それは一種の醜いですされています。;-(これを行うには良い方法はありますか?C#MessageBoxが2回表示される

private void checkbox1_CheckedChanged(object sender, EventArgs e) 
    { 
     if(var1 == "YES") 
     { 
      if (checkbox1.Checked) 
      { 
       numbox.Enabled = true; 
       combobox1.Enabled = true; 
      } 
      else 
      { 
       numbox.Enabled = false; 
       combobox1.Enabled = false; 
      } 
     } 
     else 
     { 
      MessageBox.Show("Required condition is not YES"); 
      checkbox1.Checked = false; 
     } 
    } 
+3

チェックマークを変更すると、そのイベントが再度実行されます。 「チェックマークを変更しているときにこのコードを実行しない」、またはイベントハンドラを削除して追加するという変数が必要です。 – LarsTech

+0

代わりに直観的で使いやすいUIを作成します。 var1はプロパティでなければならないので、setterはcheckbox1.Enabledプロパティを設定する必要があります。そして、あなたは彼がダミーであることをユーザーに伝える良い理由がなくなりました。 –

答えて

1

@LarsTechが言ったように...あなたが二回あなたのイベントを呼び出している。 こちら

private void checkbox1_CheckedChanged(object sender, EventArgs e) 
    { 
     checkbox1.CheckChanged -= checkbox1_CheckedChanged; 
     if(var1 == "YES") 
     { 
      if (checkbox1.Checked) 
      { 
       numbox.Enabled = true; 
       combobox1.Enabled = true; 
      } 
      else 
      { 
       numbox.Enabled = false; 
       combobox1.Enabled = false; 
      } 
     } 
     else 
     { 
      MessageBox.Show("Required condition is not YES"); 
      checkbox1.Checked = false; 
     } 
     checkbox1.CheckChanged += checkbox1_CheckedChanged; 
    } 
+0

ファンタスティック!素晴らしい作品...ありがとう。 @ – ArtR45

1

イベントハングを削除して読み込むことができます。下記の例のようにdlerを使用します。代わりにあなたがユーザ入力を検出するcheckbox1_Clickイベントを使用することができcheckbox1_CheckedChangedイベントの

else 
     { 
      MessageBox.Show("Required condition is not YES"); 
      checkbox1.CheckedChanged -= checkbox1_CheckedChanged; 
      checkbox1.Checked = false; 
      checkbox1.CheckedChanged += checkbox1_CheckedChanged; 
     }  
1

。プログラムでcheckbox1.Checked状態を変更すると、checkbox1_Clickイベントは発生しません。

private void checkbox1_Click(object sender, EventArgs e) 
{ 
    //your code 
} 
+0

ユーザーがキーボードで作業する場合(checkbox1_Clickは発生しません)、checkbox1_Clickは発生しません(checkbox1_Clickは発生しません)。 –

+0

'checkbox1_Click'メソッドをチェックボックスの' KeyPress'イベントにさらにバインドすることができます。 – RomCoo

+0

...チェックボックスのチェック状態を変更する他の方法を忘れていないことを願っています。私は他の答えで提案されているアプローチを好む: "コードはチェックされたプロパティを変更している"というフラグを設定するか、 –

1

箱がすでにチェックされていない場合はメッセージを表示し、チェックボックスをオフに必要であるように見えるではない...ので、あなたがメッセージを表示する前に、なぜちょうどボックスがチェックされているかどうかをチェックしません。いつもイベントの登録に手を出すのではなく、

private void checkbox1_CheckedChanged(object sender, EventArgs e) 
{ 
    if(var1 == "YES") 
    { 
     if (checkbox1.Checked) 
     { 
      numbox.Enabled = true; 
      combobox1.Enabled = true; 
     } 
     else 
     { 
      numbox.Enabled = false; 
      combobox1.Enabled = false; 
     } 
    } 
    else if (checkbox1.Checked) 
    { 
     MessageBox.Show("Required condition is not YES"); 
     checkbox1.Checked = false; 
    } 
} 
関連する問題