2017-07-18 7 views
0

2つのラジオボタンが配置されたフォームがあります。私の問題は、1つがクリックされると、もう1つはクリックされないように機能するために必要なことです。私は次のコードを持っていますが、一度クリックすれば無限ループに陥り、その理由を理解しています。あなたの誰かがC#でこれを作る方法を知っているかどうかを見たいと思っていましたか?私はかなり新しくC#C#VS - 1つのラジオボタンがオンになっているときに、別のラジオボタンをオフにしたとき

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     radAllCols.CheckedChanged += new EventHandler(this.radAllCols_Checked); 
     radSelCols.CheckedChanged += new EventHandler(this.radSelCols_Checked); 
    } 

    private void radAllCols_Checked(object sender, EventArgs e) 
    { 
     if (radAllCols.Checked == true) 
     { 
      radAllCols.Checked = false; 
      radSelCols.Checked = true; 
     } 
    } 

    private void radSelCols_Checked(object sender, EventArgs e) 
    { 
     if (radSelCols.Checked == true) 
     { 
      radSelCols.Checked = false; 
      radAllCols.Checked = true; 
     } 
    } 
} 
+9

のRadioButtonを(パネルのように)デフォルトでこのように動作します。 – user6144226

+1

グループボックスやパネルなどのコンテナにラジオボタンを配置する必要があります。 –

+0

ラジオボタンをパネルまたはグループボックスに配置すると、イベントをバインドする必要はなく、そのうちの1つだけを選択することもできます。 Checked Propertyを使用してチェックされるラジオボタンを取得できます。 –

答えて

2

を確認するために、同じラジオボタンをオフにしようとしているので、これはあなたの無限の「ループ」

を引き起こしRadioGroupの値が必要です。まず、Checkedイベントの登録を解除し、Checkedプロパティ値を変更して、Checkedイベントを再登録します。

private void radAllCols_Checked(object sender, EventArgs e) 
{ 
    if (radAllCols.Checked == true) 
    { 
     radAllCols.CheckedChanged -= new 
       EventHandler(this.radAllCols_Checked); 
     radSelCols.CheckedChanged -= new 
       EventHandler(this.radSelCols_Checked); 
     radAllCols.Checked = false; 
     radSelCols.Checked = true; 
     radAllCols.CheckedChanged += new 
       EventHandler(this.radAllCols_Checked); 
     radSelCols.CheckedChanged += new 
       EventHandler(this.radSelCols_Checked); 
    } 
} 

private void radSelCols_Checked(object sender, EventArgs e) 
{ 
    if (radSelCols.Checked == true) 
    { 
     radAllCols.CheckedChanged -= new 
       EventHandler(this.radAllCols_Checked); 
     radSelCols.CheckedChanged -= new 
       EventHandler(this.radSelCols_Checked); 
     radSelCols.Checked = false; 
     radAllCols.Checked = true; 
     radAllCols.CheckedChanged += new 
       EventHandler(this.radAllCols_Checked); 
     radSelCols.CheckedChanged += new 
       EventHandler(this.radSelCols_Checked); 
    } 
} 

上記のコードは非常にカスタムのシナリオ用であり、可能な限り避けるべきです。ラジオボックスは、自動的に必要な方法で動作するはずです。両方に同じRadioGroupプロパティ値が設定されていることを確認してください。

+0

この問題は、ラジオボタンの1つを舐めると、もう一方が選択され、次に私が何をしても、もう一方を選択することはできません。それはそれをロックするかのようですか? – SBozhko

+0

心配しないで、これは私が 'Form1'で持っていた' EventHandler'を削除しなかったためだと思います。今はうまくいっているようだ! – SBozhko

0

同じ親コントロール(パネルのような)に配置されたラジオボタンは、このようにデフォルトで動作します。

これにチェックされたイベントを使用する必要はありません。 radAllCols.Checked = trueプロパティの値を設定

radAllCols_Checkedイベントが発生しますが、ラジオボタンが異なっている場合

private void radSelCols_Checked(object sender, EventArgs e) 
{ 
    if (radSelCols.Checked == true) 
    { 
     radSelCols.Checked = false; // reversed 
     radAllCols.Checked = true; // reversed 
    } 
} 
+0

ええ、私は無限ループ部分を得て、これを過去のものにする方法を見つけ出そうとしているので、これらのボックスのチェック/チェックを外すときにのみ発生します。 – SBozhko

+0

@ user6144226ここに何か不足していますか? 'radiobuttons'はフォーム自体にあります。 'CheckChanged'イベントが必要ですか?彼らは期待通りの動作をしないでしょうか? –

+1

@SBozhkoは 'public Form1()の行をコメントアウトできますか? {}'あなたが探しているものを手に入れてください –

1

あなたが使用している場合は、あなたがそれらのいずれかを選択したい、同じラジオボタンのGroupBoxのコンテナ要素、あなたが他のすべてのラジオボタンをラジオボタンを選択すると、手動でラジオボタンの状態をチェック扱う必要がある `tのあなた同じグループ内ではチェックされません。

0

コードのあなたの残りの部分は大丈夫ですが、あなたは無限ループを防ぐために、後述するように)(チェック方法で、あなたのコードを変更する必要がありますし、それが正常に動作します:同じ親コントロール内に配置さ

private void radAllCols_Checked(object sender, EventArgs e) 
{ 
    radAllCols.Checked = !radSelCols.Checked; 
} 

private void radSelCols_Checked(object sender, EventArgs e) 
{ 
    radSelCols.Checked = !radAllCols.Checked; 
} 
関連する問題