C#Errorprovider.ContainerControl.Controls只包含TabControl

C#Errorprovider.ContainerControl.Controls只包含TabControl,c#,winforms,visual-studio,error-handling,C#,Winforms,Visual Studio,Error Handling,我有一个包含TabControl和ErrorProvider的表单。其中一个选项卡有几个文本框和一个按钮。如果内容无效,文本框将使用验证事件设置错误()。按下按钮时,将运行: bool ok = true; foreach (Control c in errorProviderDv.ContainerControl.Controls) { MessageBox.Show(c.Name); if (errorProviderDv.GetError(c) != "")

我有一个包含TabControl和ErrorProvider的表单。其中一个选项卡有几个文本框和一个按钮。如果内容无效,文本框将使用验证事件设置错误()。按下按钮时,将运行:

 bool ok = true;
 foreach (Control c in errorProviderDv.ContainerControl.Controls)
 {
    MessageBox.Show(c.Name);
    if (errorProviderDv.GetError(c) != "")
    {
        ok = false;
    }
 }
TabControl是errorProviderDv.ContainerControl.Controls中唯一的控件,即使表单中设置并显示了多个错误


我做错什么了吗?ErrorProvider是否需要是选项卡的子级而不是表单的子级

TabControl本身是一个包含TabPages的容器。这些选项卡页是包含文本框的容器

下面的代码将得到您想要的结果,但是您可能需要清理它,以便在容器中传递递归调用,这样它几乎可以用于任何类型

    private void button1_Click(object sender, EventArgs e)
    {
    bool ok = true;
    foreach (Control c in errorProviderDv.ContainerControl.Controls)
    {
        if (c is TabControl)
        {
            foreach (Control t in (c as TabControl).SelectedTab.Controls)
            {
                MessageBox.Show(t.Name);
                if (errorProviderDv.GetError(t) != "")
                {
                    ok = false;
                }
            }
        }
    }
}

TabControl本身是一个包含TabPages的容器。这些选项卡页是包含文本框的容器

下面的代码将得到您想要的结果,但是您可能需要清理它,以便在容器中传递递归调用,这样它几乎可以用于任何类型

    private void button1_Click(object sender, EventArgs e)
    {
    bool ok = true;
    foreach (Control c in errorProviderDv.ContainerControl.Controls)
    {
        if (c is TabControl)
        {
            foreach (Control t in (c as TabControl).SelectedTab.Controls)
            {
                MessageBox.Show(t.Name);
                if (errorProviderDv.GetError(t) != "")
                {
                    ok = false;
                }
            }
        }
    }
}

您不能将
TabControl
TabPage
分配为
ContainerControl
ErrorProvider
。你的要求是什么?您想知道整个
表单的验证状态,还是只想知道
TabControl
的特定
TabPage
?我一次只看一个TabPage。每个选项卡页都有不同的ErrorProvider。您不需要使用多个
ErrorProvider
组件。其中一个就足够了。无论如何,如果您想检查这些控件,可以将foreach更改为在
中查找(tabControl1.TabPages[0].Controls中的控件c中的控件c)
。另外,看看这篇文章,您可能会发现它很有用:控件层次结构是一个树,而不是一个数组或集合。递归遍历树的效果最好,请使用
c.Controls
。或不能考虑。<代码> > TabFor < /COD>或<代码> TabPox<代码>为<代码>容器控件< /代码>或<代码> ErrorProvider < /代码>。你的要求是什么?您想知道整个
表单的验证状态,还是只想知道
TabControl
的特定
TabPage
?我一次只看一个TabPage。每个选项卡页都有不同的ErrorProvider。您不需要使用多个
ErrorProvider
组件。其中一个就足够了。无论如何,如果您想检查这些控件,可以将foreach更改为在
中查找(tabControl1.TabPages[0].Controls中的控件c中的控件c)
。另外,看看这篇文章,您可能会发现它很有用:控件层次结构是一个树,而不是一个数组或集合。递归遍历树的效果最好,请使用
c.Controls
。或者考虑一下。