如何迭代多种类型的 Groupbox 并仍然读取属性? (C# Windows 窗体)

问题描述 投票:0回答:1

我正在尝试迭代单选按钮的 GroupBox 的 GroupBox,但我遇到了困难,因为 GroupBox 还包含其他节点,例如标签和文本框。 为了更好地说明,节点树是:

Groupbox
\/
GroupBox(es) + TextBox + Label
\/
RadioButton(s) + TextBox

我的目标是迭代所有可能的 RadioButtons,找到每个部分中哪些被选中(如果有的话)(或者换句话说,具有属性 (radiobuttonname).Checked == True) 不过,我似乎无法做到这一点,因为我想出的每个解决方案都存在问题。

代码:

int i = 0;
RadioButton[] currentData = [null, null, null, null, null, null, null, null];
        
foreach(Control group in check.Controls)
{
    if (group is GroupBox)
    {
        foreach(Control rb in group.Controls)
        {
            if (rb is RadioButton) //All RadioButtons are correctly recognized (confirmed by print test)
            {
                if ((RadioButton) rb.**Checked**){ //Cannot Resolve Symbol "Checked"
                    currentData[i] = ((RadioButton) rb);
                    break;
                }
            }
        }
                
        i++;
    }
}

return currentData;

上面应该先进入主GroupBox,然后进入各个次GroupBox,然后迭代每个RadioButton,将选中的RadioButton添加到要返回的数组中(如果没有就留空)。

解决方案/问题: -我可以将它们作为 foreach(RadioButton rb in group.Controls) 运行吗? 但如果我这样做,程序就会失败,因为我将 TextBox 转换为 Radiobutton -我可以将 foreach 作为 for 循环运行,找到绕过该问题的方法? 但是每个 GroupBox 中的节点数量各不相同,我不相信我可以像数组一样迭代一个 -我可以将控件(我知道是RadioButtons)投射为RadioButtons,如上所示? 但只要它们首先成为控件,它们似乎就失去了访问 .Checked 属性的能力 -我可以从 GroupBox 中删除所有非 RadioButtons 吗? 但这会破坏我正在制作的应用程序的意义......

如有任何帮助,我们将不胜感激。我已经坚持了好几天了,想继续前进。

c# winforms radio-button groupbox
1个回答
0
投票

尽管您将某事物称为特定事物,但并不一定如此。 您的 rb 变量是控制类型。但是,如果您将其投射到 RadioButton 并说它应该像它一样工作而不仅仅是其名称,那么它就会像您希望的那样工作。 有不止一种方法可以做到这一点,但你可以这样做:

foreach(Control cntrl in group.Controls)
    {
        if (cntrl is RadioButton rb) //All RadioButtons are correctly recognized (confirmed by print test)
        {
            //do stuff with you RadioButton rb
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.