【问题标题】:Event handler for groupBox with radioButtons in C#C# 中带有单选按钮的 groupBox 的事件处理程序
【发布时间】:2012-06-25 00:17:17
【问题描述】:

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

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

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

【问题讨论】:

  • 您可能希望在问题主题或标签中从 WPF 开始。也标记不正确。
  • 除了它不是 WPF 而是 WFA,为什么要提到它这么重要?如果我在 C# 中编写的内容还不清楚,那么 C# 中的事件处理是否存在一些差异?我想如果它是一种编程语言,它应该是相同的(这对我来说似乎是合乎逻辑的,我没有任何信息不是 - 但我也没有任何信息,所以我问你是因为你有问题与它)。
  • 问题下也只能有5个标签...
  • 是的,我正在使用 WPF,不,你不是,但谢谢。我已经在为单个单选按钮使用选中的更改。我需要知道是否存在类似“groupBox 中某个对象的值已更改”之类的东西 - 我的意思是 groupBox 的事件处理程序而不是 radioButtons ......也许它没有...... – user1097772 3 小时前

标签: c# event-handling radio-button groupbox


【解决方案1】:

我认为您想要做的是将所有 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
    }
}

【讨论】:

  • 顺便说一句,我假设您使用的是 WinForms。
  • 这不会触发事件两次吗?一次用于旧的选定单选按钮,一次用于新的?因为两者都改变​​了价值,对吧?
  • @Enrico 我刚刚测试了它,是的。因此,如果您不希望这种情况发生,那么 Click 事件可能会更好。通过测试查看现在选中的单选按钮与之前选择的单选按钮不同。此外,单击会在表单加载时自动运行一次(不仅仅是单击!),但它会在表单处于活动状态之前发生。因此,在 click 方法中,您可以测试表单是否曾经被激活(激活表单时将布尔值设置为 true),在 click 方法中,测试布尔值是否为真,然后运行您想要的代码点击方法
  • 当前语法是 radioButton1.CheckedChanged += radioButtons_CheckedChanged; 无需将新的 EventHandler 包裹起来,即无需说 radioButton1.CheckedChanged += new EventHandler(radioButtons_CheckedChanged);
【解决方案2】:

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

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

【讨论】:

  • 谢谢,但这是我目前的解决方案。但是没有radioGroup组件,组件列表中只有组框。所以我正在为 groupBox 找到一些事件处理程序。
  • 没有。所有 groupbox 所做的只是包含带有边框和标题的其他组件。我可以给你一些关于如何创建无线电组组件或扩展组框的想法。无法想出一个不存在的行为。
【解决方案3】:

我遇到了同样的问题:一个名为 Button Type (gbxButtonType) 的组合框有 6 个单选按钮和另一个名为 Icon Type 的组合框(gbxIconType) 带有 8 个单选按钮。当用户从每个组框中选择一个单选按钮时,将出现一个消息框,并在单击 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;
        }
   }

【讨论】:

    【解决方案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
            }
        }
    }
    

    【讨论】:

      【解决方案5】:

      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
          }
      

      【讨论】:

      • 假设您使用的是 WinForms 和开箱即用的标准控件,并假设我正确解释了您的问题
      • 是的,我正在使用 WPF,不,你不是,但谢谢。我已经在为单个单选按钮使用选中的更改。我需要知道是否存在类似“groupBox 中某个对象的值已更改”之类的东西 - 我的意思是 groupBox 的事件处理程序而不是 radioButtons ......也许它没有......
      【解决方案6】:

      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;
              }
          }
      }
      

      【讨论】:

        【解决方案7】:

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

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

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

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

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

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

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

        【讨论】:

          【解决方案8】:

          //这是乔克·弗兰克·哈利戴的礼貌

               //^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;
              }
          

          【讨论】:

            【解决方案9】:
            //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....
                }
            
            }
            

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:
                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
                }
                

                【讨论】:

                  【解决方案12】:
                  1. 在设计器事件列表中的一个单选按钮上创建事件 Checked_Changed。

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

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

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

                  你可以知道哪个收音机现在处于活动状态。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-06-26
                    • 2013-08-16
                    • 1970-01-01
                    • 2012-08-17
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多