C# 中带有单选按钮的 groupBox 的事件处理程序

Posted

技术标签:

【中文标题】C# 中带有单选按钮的 groupBox 的事件处理程序【英文标题】:Event handler for groupBox with radioButtons in C# 【发布时间】: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 小时前 【参考方案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】:
    通过双击任何单选按钮创建 Checked 事件,复制 Visual Studio 为该事件创建的方法的名称 转到所有单选按钮并将事件更改为从“属性资源管理器”>“事件部分”复制的事件 在生成的方法中使用以下代码。这会触发所有单选按钮的事件,但只会触发一次“做你的事”

代码:

private void radioButtons_CheckedChanged (object sender, EventArgs e)

    RadioButton rb = sender as RadioButton;

    if (rb.Checked == false) return;

    // Do your thing

【讨论】:

【参考方案12】:

    在设计器事件列表中的一个单选按钮上创建事件 Checked_Changed。

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

    内部检查更改事件使用

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

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

【讨论】:

以上是关于C# 中带有单选按钮的 groupBox 的事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章

C# 侦听 groupbox 中的复选框更改

如何用单选按钮替换 Groupbox Text 属性?

如何通过软件取消链接没有 GroupBox 的所有单选按钮

如何在UnChecked时触发单选按钮的OnChange事件

在windows Form应用程序c#中使用DialogResult

点击事件里面的change事件,多次触发change事件