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

C# 在Windows窗体中是否有多种方法对单选按钮进行分组?,c#,winforms,radio-button,C#,Winforms,Radio Button,我的表单中有几个单选按钮,它们都应该连接起来,但我希望其中一个按钮放在一个单独的容器中,专门将其与一些其他相关输入分组。以下是总体外观: 是否有办法将第四个单选按钮与其他3个单选按钮分组,即使它位于自己的分组框中?它们位于不同的容器中,因此您无法进行分组。我认为这是这个问题的一个骗局:这个问题谈到它: 您可以处理单选按钮的CheckedChanged事件,以完成所需: public partial class Form1 : Form { public Form1() {

我的表单中有几个单选按钮,它们都应该连接起来,但我希望其中一个按钮放在一个单独的容器中,专门将其与一些其他相关输入分组。以下是总体外观:


是否有办法将第四个单选按钮与其他3个单选按钮分组,即使它位于自己的分组框中?

它们位于不同的容器中,因此您无法进行分组。我认为这是这个问题的一个骗局:

这个问题谈到它:

您可以处理单选按钮的
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;
        }
    }
}

事实上,只有当单选按钮位于同一个父按钮内时,它们才是互斥的。据说我可以想出两个选择

  • 让他们在同一个父对象中,处理父对象的
    Paint
    事件并手动绘制自己,给人留下他们是不同组的印象
  • 您必须手动管理互斥:(
  • 单选按钮不是魔法,它们只是在幕后将其他收音机的
    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;
        }
    }
    
    private List单选按钮=新建列表();
    //用感兴趣的无线电来填充它,然后调用HookUpEvents,这样就可以了
    私有void连接事件()
    {
    foreach(单选按钮中的var单选)
    {
    radio.CheckedChanged-=性能一致性结论;
    radio.CheckedChanged+=性能一致性结论;
    }
    }
    private void PerformMutualExclusion(对象发送方,事件参数e)
    {
    单选senderRadio=(单选按钮)发送器;
    如果(!senderRadio.Checked)
    {
    返回;
    }
    foreach(单选按钮中的var单选)
    {
    if(radio==发送方| |!radio.选中)
    {
    继续;
    }
    radio.Checked=false;
    }
    }
    
    所有单选按钮都可以在同一个父容器中。您只需要有问题的单选按钮就可以在组框的顶部绘制

    您可以将所有单选按钮放在同一个父容器中(组框也可以放在父容器中),但要配置单选按钮的位置和z顺序,使其位于组框上方并在其上方绘制。这将为您提供所需的行为

    要在设计器中执行此操作,请先添加组框,然后将单选按钮添加到父容器中,将其放入父容器中,选择单选按钮,然后使用键盘上的箭头键将其移动到位

    确保右键单击它,然后“将其带到前面”和/或将分组框发送到后面,以便他们按照正确的顺序绘制


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

    这似乎是通用的,并且可以轻松地用于区分Enter应用程序。我也可以考虑把它和一些属性结合起来。谢谢!