web-dev-qa-db-ja.com

C#でradioButtonを使用するgroupBoxのイベントハンドラー

GroupBoxにいくつかのradionButtonsがあり、 "radiobuttons.checked changed"の1つと呼ぶアクションを実行するか、radiobuttonから変更されたインデックスを確認する必要があります。イベントのリストで見つけようとしましたが、適切なものを見つけることができませんでした。

編集:より明確にするために:単一のradioButtonではなく、goupBoxのハンドラーメソッドを記述するためのハンデルが存在するかどうかを知る必要があります。私はradiButton.checkedChangedの使用方法を知っていますが、それが私が見つけているものではありません。 「グループボックス内で何かが発生する」または存在する場合は同様のハンドラーを見つけています。

Visual Studio 2012のWFA(Windows Presentation Application)にあります。

13
user1097772

あなたがしたいことは、RadioButtonsのすべてのCheckedChangedイベントを同じハンドラーに結び付けることだと思います。

public Form1()
{
    radioButton1.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
    radioButton2.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);

    // ...
}

private void radioButtons_CheckedChanged (object sender, EventArgs e)
{
    RadioButton radioButton = sender as RadioButton;

    if (radioButton1.Checked)
    {
        // Do stuff 
    }
    else if (radioButton2.Checked)
    {
        // Do other stuff
    }
}
33
Dave New

私が知る限り、そのために組み込まれたものはありません。

Tagプロパティをある種のインジケーター(0からn)に設定することで実行できます。

CheckChangedHandlerを追加する

すべてのボタンCheckChangedイベントをそれに向けます。

その後のようなもの。

private void radioButtons_CheckedChanged (object sender, EventArgs e) 
{     
  RadioButton radioButton = sender as RadioButton;      
  int buttonid = (int)radioButton.Tag;
  switch (buttonid)
  {
    case 0 : // do something; break
  }
} 

これらがいくつかある場合は、radiogroupコンポーネントを調べます。

5
Tony Hopkinson

同じ問題がありました:Button Type((gbxButtonType)という名前のグループボックスに6つのラジオボタンとアイコンタイプ(gbxIconType) 8個のラジオボタン。ユーザーが各グループボックスから1つのラジオボタンを選択すると、DisplayButtonをクリックした後に選択が適用された状態でMessageBoxが表示されます。私の問題は、グループボックスにCheckedChangedイベントがないことでした。 AKNのソリューションは完全に機能しました。

public Form1()
    {
        InitializeComponent();

        for (int i = 0; i < gbxButtonType.Controls.Count; i++)
        {
            RadioButton rdb = (RadioButton)gbxButtonType.Controls[i];
            rdb.CheckedChanged += new System.EventHandler(gbxButtonType_CheckedChanged);
        }

        for (int i = 0; i < gbxIconType.Controls.Count; i++)
        {
            RadioButton rdb = (RadioButton)gbxIconType.Controls[i];
            rdb.CheckedChanged += new System.EventHandler(gbxIconType_CheckedChanged);
        }
    }

private void gbxIconType_CheckedChanged(object sender, EventArgs e)
    {
        if (sender == rdbAsterisk)
        {
            iconType = MessageBoxIcon.Asterisk;
        }
        else if (sender == rdbError)
        {
            iconType = MessageBoxIcon.Error;
        }
        ...
        else
        {
            iconType = MessageBoxIcon.Warning;
        }
   }
4
Emanuel

Davenewzaの回答と似ています(コメントであるはずですが、評判は不十分です)が、ラジオボタンのグループ全体に対してイベントが1回だけ発生します。

public Form1()
{
    // Add a "CheckedChanged" event handler for each radio button.
    // Ensure that all radio buttons are in the same groupbox control.
    radioButton1.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
    radioButton2.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
}

private void radioButtons_CheckedChanged (object sender, EventArgs e)
{
    // Do stuff only if the radio button is checked (or the action will run twice).
    if (((RadioButton)sender).Checked)
    {
        if (((RadioButton)sender) == radioButton1)
        {
            // Do stuff 
        }
        else if (((RadioButton)sender) == radioButton2)
        {
            // Do other stuff
        }
    }
}
3
adamj537

Groupboxはチェックされた1つのラジオボタンのみを制限します

したがって、Setp1:ラジオボタンすべてに「CheckedChanged」イベントハンドラを1つ割り当てることができます。

private void initRadio()
{
        radio_button1.CheckedChanged += Radio_show_CheckedChanged;
        radio_button2.CheckedChanged +=Radio_show_CheckedChanged;
}

そしてSetp2:このようにこのイベントハンドラを実装します(ラジオボタンのテキストでフィルタ)

private void Radio_show_CheckedChanged(object sender, EventArgs e)
{
    RadioButton radioButton = sender as RadioButton;
    if (radioButton.Checked == true) { //limited only checked button do function
        switch (radioButton.Text)
        {
            case "name1":
                // do your stuff ...
                break;
            case "name2":
                // do your stuff ...
                break;
        }
    }
}
1
Li Kevin

//ジョックフランクハリデーのご厚意により

     //^subscribe events to radio button check changed 
    private void seriesTxtBxEvent()
    {
        //Show txtBx
        this.radBtn_RoomSeries.CheckedChanged += new EventHandler(showSeriesTxtBx_Event);
        //Hide txtBx
        this.radBtn_RoomNumber.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
        this.radBtn_RoomName.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
        this.radBtn_RoomLevel.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
        this.radBtn_RoomDep.CheckedChanged += new EventHandler(hideSeriesTxtBx_Event);
    }



    private void hideSeriesTxtBx_Event(object sender, EventArgs e)
    {
        tbx_SheetSeries.Visible = false;
    }


    private void showSeriesTxtBx_Event(object sender, EventArgs e)
    {
        tbx_SheetSeries.Visible = true;
    }

私はあなたがグループボックス内のいくつかのラジオボタンの選択を扱いたいと思いますグループボックスコントロール自体を使用して

基本的にコードの繰り返しを避けるためにこれが欲しかったのかもしれません。

(つまり)デザイナーのすべてのラジオボタンにチェック変更イベントを追加します。グループの下に既に存在するので、グループコントロールオブジェクトを使用して、その中でコントロールを操作し、イベントを設定してみませんか。

これが私があなたの問題を理解した方法であり、したがって以下に示す解決策です。

グループボックス内のすべてのラジオボタンコントロールに共通のハンドラーを設定する

for (int i = 0; i < groupBox.Controls.Count; i++)
{
    RadioButton rb = (RadioButton)groupBox.Controls[i];
    rb.CheckedChanged += new System.EventHandler(evntHandler);
}

ハンドラー内で、他のユーザーが示すように変更されたボタンを特定し、必要なアクションを実行できます。

1
AKN

System.Windows.Forms.RadioButton.CheckedChanged

あなたが必要とするイベントです

だから次のようなことをしてください:

    public Form1()
    {
        InitializeComponent();

        this.radioButton1.CheckedChanged += new EventHandler(radioButton1_CheckedChanged);
    }

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        // your action
    }
1
Big Endian

タイマーでそれを行うこともできますが、それは最適化には良くありません。簡単な解決策は、すべてのラジオボタンに対して、CheckedChangedイベントとして関数を1つだけ追加することです。

0
//Form Start

void MainFormLoad(object sender, EventArgs e)
{

    Control.ControlCollection locais =  groupBoxLocalização.Controls;

        foreach (CheckBox chkBox in locais)
        {
            chkBox.MouseUp += chkBoxLocais_MouseUp;
        }
}

// Event
void chkBoxLocais_MouseUp(object sender, MouseEventArgs e)
{

    //Tratar individualmente
    CheckBox chk = (CheckBox)sender;

    //ou para tratar todos objetos de uma vez

    Control.ControlCollection locais =  groupBoxLocalização.Controls;
    foreach (CheckBox chkBox in locais) {
        //chkBox....
    }

}