web-dev-qa-db-ja.com

変更されたイベントが2回発生することを確認するラジオボタン

重複していない私の質問を読んでください。

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

ここに私のコードがあります:

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

ブレークポイントを挿入すると、このイベント内のコード全体が2回繰り返されます。なぜこんなふうに振る舞っているのか教えてください。

28

他の回答者が正しく言っているように、グループ内の1つのRadioButtonがチェックされるたびに別のRadioButtonのチェックが解除されるため、イベントは2回発生します。

選択したRadioButtonに対してこのイベント内でのみ作業を行うには、送信者オブジェクトを見て、次のようにします。

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);
        }
    }
}
63
David Hall

それを避けるには、radioButtonがチェックされているかどうかを確認してください。

例えば:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    if (radioButton1.Checked == true)
        //your code
}
5
jaleel

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

4
kmatyaszek

ラジオボタンがチェックされた状態からチェックされていない状態に移行するために1回トリガーされ、チェックされていない状態からチェックされた状態に移行するラジオボタンに対して再度トリガーされます(つまり、チェックされた状態の変更がイベントをトリガーします)

各RadioButtonのAutoCheckプロパティをtrueに設定し、CheckChangedイベントの代わりにClickイベントをキャッチできます。これにより、イベントが1つだけ発生することが保証され、ハンドラーのロジックは、クリックを処理する必要がある場合、RadioButtonと入力するために送信者をキャストできます。ハンドラロジックが単純な場合、キャストを回避できることがよくあります。以下は、rbTextNumeric、rbTextFixed、rbTextFromFileの3つのコントロールを処理する例です。

        private void rbText_Click(object sender, EventArgs e)
    {
       flowLayoutPanelTextNumeric.Enabled = rbTextNumeric.Checked;
       txtBoxTextFixed.Enabled = rbTextFixed.Checked;
       flowLayoutPanelTextFromFile.Enabled = rbTextFromFile.Checked;
    }
0
Steve Stover
{
    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";
            }
        }

    }
}
0
Emin