foreach c#给出无法施放错误

时间:2013-04-25 07:13:27

标签: c# winforms foreach

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

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

7 个答案:

答案 0 :(得分: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 collection仅包含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;
    }
}

答案 1 :(得分:5)

使用OfType<T>()方法:

foreach (RadioButton item in yourChildern.OfType<RadioButton>())
{
    //your code
}

答案 2 :(得分:2)

使用

quiztabs.TabPages.OfType<RadioButton>()quiztabs.TabPages.OfType<CheckBox>()代替quiztabs.TabPages代码。

Alternativly;

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;
   }
}

答案 3 :(得分: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;
        }
}

答案 4 :(得分:0)

foreach需要有一个迭代器(此处为rad),你想要迭代的任何类型(TabPages):

所以它看起来像:

foreach (TabPage tab in quiztabs.TabPages) {

虽然TabPagesquiztabs.TabPages所属的任何类型的对象。

希望这是有道理的!

答案 5 :(得分:0)

因为,标签不是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;
        }
    }

答案 6 :(得分: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;
            }