是否有多种方法可以在Windows窗体中对单选按钮进行分组?

时间:2014-04-14 16:32:29

标签: c# winforms radio-button

我的表单中有几个单选按钮应该全部连接,但是我希望其中一个单独的容器在一个单独的容器中与其他一些相关输入进行特殊分组。这是一般的外观:

Radio Button Inputs

有没有办法将第四个单选按钮与另一个单选按钮分组,即使它位于自己的组框中?

4 个答案:

答案 0 :(得分:2)

事实上,单选按钮只有在同一父级内时才是互斥的。据说我可以想到两个选择。

  1. 让他们在同一个父母中,处理父母的Paint事件并手动绘制自己,给人的印象是他们是不同的群组。
  2. 您必须手动管理互斥:(
  3. RadioButtons没有魔力,它们只是在幕后将其他无线电的Checked属性设置为false。

    private List<RadioButton> radioButtons = new List<RadioButton>();
    //Populate this with radios interested, then call HookUpEvents and that should work
    
    private void HookUpEvents()
    {
        foreach(var radio in radioButtons)
        {
            radio.CheckedChanged -= PerformMutualExclusion;
            radio.CheckedChanged += PerformMutualExclusion;
        }
    }
    
    private void PerformMutualExclusion(object sender, EventArgs e)
    {
        Radio senderRadio = (RadioButton)sender;
        if(!senderRadio.Checked)
        {
            return;
        }
        foreach(var radio in radioButtons)
        {
            if(radio == sender || !radio.Checked)
            {
                continue;
            }
            radio.Checked = false;
        }
    }
    

答案 1 :(得分:0)

他们在不同的容器中,所以你无法做到。我认为这是这个问题的一个骗局:Radiobuttons as a group in different panels

答案 2 :(得分:0)

这个问题谈到了它:

VB.NET Group Radio Buttons across different Panels

您可以处理单选按钮的CheckedChanged事件以完成您的需要:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.radioButton1.CheckedChanged += new System.EventHandler(this.HandleCheckedChanged);
        this.radioButton2.CheckedChanged += new System.EventHandler(this.HandleCheckedChanged);
        this.radioButton3.CheckedChanged += new System.EventHandler(this.HandleCheckedChanged);
    }

    private bool changing = false;

    private void HandleCheckedChanged(object sender, EventArgs e)
    {
        if (!changing)
        {
            changing = true;

            if (sender == this.radioButton1)
            {
                this.radioButton2.Checked = !this.radioButton1.Checked;
                this.radioButton3.Checked = !this.radioButton1.Checked;
            }
            else if (sender == this.radioButton2)
            {
                this.radioButton1.Checked = !this.radioButton2.Checked;
                this.radioButton3.Checked = !this.radioButton2.Checked;
            }
            else if (sender == this.radioButton3)
            {
                this.radioButton1.Checked = !this.radioButton3.Checked;
                this.radioButton2.Checked = !this.radioButton3.Checked;
            }

            changing = false;
        }
    }
}

答案 3 :(得分:0)

所有单选按钮都可以在同一个父容器中。您只需要有问题的单选按钮来绘制组合框的顶部。

您可以将所有单选按钮放在同一个父容器中(分组框也会进入父容器),但配置有问题的单选按钮的位置和 z 顺序,使其位于分组框上方并画在它上面。这会给你你想要的行为。

要在设计器中执行此操作,要在分组框顶部获得单选按钮(不能拖放或设计器将其放入分组框),首先添加分组框,然后添加父级的单选按钮只需将其放在父级容器中,选择它,然后使用键盘上的箭头键将其移动到位。

确保右键单击它并“移到前面”和/或将分组框移到后面,以便它们以正确的顺序绘制。

** 一种更hacky的方法是编辑设计器生成的代码 - 删除将单选按钮添加到组框控件集合的代码行,添加一行代码将其添加到父容器的控件集合中,并使用类似的代码行处理位置和 z-oder。