foreach c#给出无法投射错误

foreach c#给出无法投射错误,c#,winforms,foreach,C#,Winforms,Foreach,我有一个用C#编写的程序,带有一个清除按钮,需要清除整个表单的内容。对于我在foreach上使用的单选按钮和复选框按钮 foreach (RadioButton rad in quiztabs.TabPages) { rad.Checked = false; } foreach (CheckBox chk in quiztabs.TabPages) { chk.Checked = false; } 但是,当我单击“清除”按钮时,我得到一个无法将System.Windows.Fo

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

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

但是,当我单击“清除”按钮时,我得到一个无法将System.Windows.Forms.TabPage类型的对象强制转换为System.Windows.Forms.RadioButton类型的
,您的问题是
。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;
        }
}
使用类型()的
方法:

foreach (RadioButton item in yourChildern.OfType<RadioButton>())
{
    //your code
}
foreach(yourChildern.OfType()中的RadioButton项)
{
//你的代码
}

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

所以它看起来像:

foreach (TabPage tab in quiztabs.TabPages) {
尽管
TabPages
将是
quiztabs.TabPages
所属的任何类型的对象


希望这有意义

您误解了
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;
    }
使用

quiztabs.TabPages.OfType()
quiztabs.TabPages.OfType()
而不是代码中的
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;
   }
}

因为,选项卡不是
单选按钮
,您应该这样做

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;
        }
    }
foreach(quizTabs.TabPages中的TabPage-tp)
{
foreach(tp.Controls.OfType()中的RadioButton rad)
{
rad.Checked=false;
}
foreach(tp.Controls.OfType()中的复选框chk)
{
chk.Checked=假;
}
}

选择一个
列表
类型RadioButton和列表中的所有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;
            }
List List=新列表();
列表。添加(radioButton1);
列表。添加(radioButton2);
添加列表(radioButton3);
foreach(列表中的单选按钮项)
{
if(tabControl1.SelectedTab==tabControl1.TabPages[tabControl1.SelectedIndex])
item.Checked=false;
}

选项卡页不是单选按钮,所以……但这不就是位置吗?我的意思是,我该如何处理它呢?注意:您可能希望将此与关于OfType方法的其他答案(我不知道)进行比较,您仍然会有相同的强制转换错误:
对于t.Controls中的每个RadioButton rad
不进行过滤,它强制转换所有内容(并且失败),因此注释。。我在这个回答中保留了我的评论,但仍然解释了为什么OPs代码不起作用。这不是一个坏问题,您只是不理解,并来到了正确的地方学习+1 BTW@Heinzi,关于这个问题的最清晰的解释。我会接受这个答案,因为编辑正是你想要的(原始代码示例找不到任何单选按钮:P)+1表示清晰的答案@Oliver,如果你想从表单中清除所有特定类型的控件,然后使用foreach对它们进行迭代。这将不可避免地抛出(除非
tp.controls
为空),因为没有任何控件既是单选按钮又是复选框。@erikkallen好了,:D我只是困了:D
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;
            }