15

我在 groupBox 中有一些单选按钮,我需要执行我可以称之为“单选按钮之一已更改”的操作,或者从单选按钮中找出更改的索引。我试图在事件列表中找到它,但找不到合适的。

编辑: 为了更清楚:我需要知道是否存在一些handel,我将为goupBox而不是单个radioButton编写处理程序方法。我知道如何使用 radiButton.checkedChanged,但这不是我发现的......或者不同的是,我需要知道 groupBox 有哪些选项来监控这个 groupBox 内部发生的事情——我的意思是只有 groupBox 的处理程序。我正在寻找处理程序“在组框中发生了什么事”或类似的情况(如果存在)。

它位于 Visual Studio 2012的WFA(Windows 演示应用程序)中。

4

12 回答 12

41

我认为您想要做的是将所有 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
    }
}
于 2012-06-22T16:56:44.213 回答
5

我遇到了同样的问题:一个名为Button Type (gbxButtonType)的组合框有 6 个单选按钮,另一个名为Icon Type (gbxIconType)的组合框有 8 个单选按钮。当用户从每个组框中选择一个单选按钮时,将出现一个 MessageBox 并在单击DisplayButton后应用选择。我的问题是组框没有 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;
        }
   }
于 2013-10-17T13:34:22.777 回答
5

据我所知,没有任何内置功能。

将标记属性设置为某种指示符(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 组件。

于 2012-06-22T17:02:35.727 回答
4

类似于 davenewza 的答案(可能应该是评论,但我的声誉不足),但事件仅针对整个单选按钮组触发一次。

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
        }
    }
}
于 2018-12-21T18:14:42.197 回答
2

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
    }
于 2012-06-22T16:55:22.107 回答
2

Groupbox 将限制仅选中一个单选按钮

所以Setp1:您可以为所有单选按钮分配一个“CheckedChanged”事件处理程序

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;
        }
    }
}
于 2018-02-28T04:26:34.100 回答
1

我认为您想使用 groupbox 控件本身来处理 groupbox 内的一些单选按钮的选择。

可能是你想要这个基本上是为了避免代码重复。

(即)为设计器中的所有单选按钮添加检查更改事件,当有更多控制时,这可能很乏味。既然它已经存在于一个组下,为什么不使用组控件对象来操作其中的控件并设置事件。

这就是我理解您的问题的方式,因此解决方案如下所示。

为组框中的所有单选按钮控件设置一个通用处理程序

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

在处理程序中,您可以根据其他人的指示确定更改了哪个按钮并执行必要的操作。

于 2013-03-13T13:42:08.250 回答
1

//这里由乔克·弗兰克·哈利迪提供

     //^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;
    }
于 2016-01-12T11:11:08.357 回答
0
  1. 在 Designer Events 列表中的一个单选按钮上创建 Event Checked_Changed。

  2. 从每个单选的 Checked_Changed 事件前面的下拉列表中向每个单选按钮添加相同的事件

  3. 内部检查更改事件使用

    private void CheckedChanged(object sender,EventArgs e)
    {
     var radio = groupBox.Controls.OfType<RadioButton>                  
                ().FirstOrDefault(r => r.Checked).Name;
    }
    

你可以得到哪个收音机现在是活跃的。

于 2021-07-20T03:15:30.217 回答
0

您也许可以使用 Timer 来做到这一点,但这不利于优化,简单的解决方案是,对于每个单选按钮,您只需添加一个函数作为 ChekedChanged 事件。

于 2018-02-21T10:46:35.193 回答
0
  1. 通过双击任何单选按钮创建一个 Checked 事件,复制 Visual Studio 为该事件创建的方法的名称
  2. 转到所有单选按钮并将事件更改为从“属性资源管理器”>“事件部分”复制的事件
  3. 在生成的方法中使用以下代码。这将触发所有单选按钮的事件,但只有一次“做你的事”

代码:

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

    if (rb.Checked == false) return;

    // Do your thing
}
于 2020-12-11T15:56:35.023 回答
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....
    }

}
于 2017-02-13T14:52:32.060 回答