2

我有一个用 C# 编写的带有清除按钮的程序,需要清除整个表单的内容。对于我在 foreach 上用于单选按钮和复选框的按钮。

foreach (RadioButton rad in quiztabs.TabPages)
{
    rad.Checked = false;
}
foreach (CheckBox chk in quiztabs.TabPages)
{
    chk.Checked = false;
}

但是,当我单击清除按钮时,我得到一个Unable to cast object of type System.Windows.Forms.TabPage to type System.Windows.Forms.RadioButton.

4

7 回答 7

18

您误解了 的行为foreach:它不会过滤中的所有元素TabPages,它会尝试转换所有元素。

如果要过滤,可以使用 LINQ 显式执行此操作:

    foreach (RadioButton rad in quiztabs.TabPages.OfType<RadioButton>())
    {
        rad.Checked = false;
    }
    foreach (CheckBox chk in quiztabs.TabPages.OfType<CheckBox>())
    {
        chk.Checked = false;
    }

但是,这仍然不能解决您的问题,因为TabPages 集合仅包含TabPage元素。你可能想要的是这样的:

foreach (TabPage page in quiztabs.TabPages) 
{
    foreach (RadioButton rad in page.Controls.OfType<RadioButton>())
    {
        rad.Checked = false;
    }
    foreach (CheckBox chk in page.Controls.OfType<CheckBox>())
    {
        chk.Checked = false;
    }
}
于 2013-04-25T07:17:22.093 回答
5

使用OfType<T>()方法:

foreach (RadioButton item in yourChildern.OfType<RadioButton>())
{
    //your code
}
于 2013-04-25T07:16:25.873 回答
2

利用

quiztabs.TabPages.OfType<RadioButton>()quiztabs.TabPages.OfType<CheckBox>()不是quiztabs.TabPages在您的代码中。

或者;

foreach(Control c in this.Controls)
{
   if(c is RadioButton)
   {
     c.Checked = false;
   }
}

foreach(Control i in this.Controls)
{
   if(i is CheckBox)
   {
     i.Checked = false;
   }
}
于 2013-04-25T07:18:28.137 回答
0

取其中一个 List<> RadioButton 类型和该列表中的所有单选按钮。

List<RadioButton> list = new List<RadioButton>();
            list.Add(radioButton1);
            list.Add(radioButton2);
            list.Add(radioButton3);
            foreach (RadioButton item in list)
            {
                if(tabControl1.SelectedTab==tabControl1.TabPages[tabControl1.SelectedIndex])
                item.Checked = false;
            }
于 2013-04-25T07:38:12.500 回答
0

你的问题是这.TabPages是一个标签页列表......我相信你想要每个标签页上的控件

foreach(TabPage t in quizTabs.TabPages)
{
       foreach (RadioButton rad in t.Controls)
        {
            rad.Checked = false;
        }
        foreach (CheckBox chk in t.Controls)
        {
            chk.Checked = false;
        }
}
于 2013-04-25T07:16:18.987 回答
0

foreach需要有一个rad与您想要迭代的任何内容(此处)相同类型的迭代器(此处TabPages):

所以它看起来像:

foreach (TabPage tab in quiztabs.TabPages) {

尽管TabPages可以是任何类型的对象quiztabs.TabPages

希望这是有道理的!

于 2013-04-25T07:17:04.490 回答
0

因为,不是 a 中的制表符radioButton,您应该这样做,

foreach(TabPage tp in quizTabs.TabPages)
     {
        foreach (RadioButton rad in tp.Controls.OfType<RadioButton>())
        {
            rad.Checked = false;
        }
        foreach (CheckBox chk in tp.Controls.OfType<CheckBox>())
        {
            chk.Checked = false;
        }
    }
于 2013-04-25T07:19:09.733 回答