38

私の質問を読んでください。重複したものではありません。

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

これが私のコードです:

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

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

4

8 に答える 8

77

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

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

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);
        }
    }
}
于 2012-07-15T17:20:54.720 に答える
6

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

例えば:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    if (radioButton1.Checked)
        //your code
}
于 2017-01-09T10:16:02.187 に答える
5

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

于 2012-07-15T17:05:37.177 に答える
2

ラジオボタンがチェックされている状態からチェックされていない状態に移行するときに1回トリガーされ、ラジオボタンがチェックされていない状態からチェックされている状態に移行するときにトリガーされます(つまり、チェックされた状態が変化するとイベントがトリガーされます)

于 2012-07-15T17:07:07.890 に答える
0

各 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;
    }
于 2013-04-29T02:39:28.243 に答える
0

他の答えは正しいですが、根本的な問題の理由を見逃しています。ラジオ ボタンがチェックされている場合、送信される最初のイベントはチェックされていないアイテムからの変更ですが、コントロール名で状態をチェックすると、フォームがまだ更新されていないため、古いチェック ステータスが表示されます。その真のステータスを確認するには、sender オブジェクトをキャストする必要があります。これにより、必要に応じて、選択解除されている条件に関連するアクションを実行できます。

以下の珍しいシナリオでは、複数のラジオ ボタンが同じハンドラ イベントに送信されます。押されたラジオボタンに応じて異なるアクションを実行する必要があるため、チェック済みの送信者の状態をチェックするだけでは機能しません。そのため、最初にチェックを外したばかりの送信者を無視します。次に、チェックされた送信者をコントロール名で識別して、正しいアクションを処理します。

private void ModeChangedExample(object sender, EventArgs e)
{
    // multiple radio buttons come here
    // We only want to process the checked item.
    // if you need to something based on the item which was just unchecked don't use this technique. 
    // The state of the sender has not been updated yet in the form.
    // so checking against rdo_A check state will still show it as checked even if it has just been unchecked
    // only the sender variable is up to date at this point.
        
    // To prevent processing the item which has just been uncheked
    RadioButton RD = sender as RadioButton;
    if (RD.Checked == false) return;

    if (rdo_A.Name == RD.Name)
    {
        //Do stuff
    }

    if (rdo_B..Name == RD.Name)
    {
        // Do other stuff
    }

    if (rdo_C.Name == RD.Name)
    {
        // Do something else
    }

}
于 2020-08-05T11:32:09.590 に答える