【问题标题】:C# Errorprovider.ContainerControl.Controls contains just TabControlC# Errorprovider.ContainerControl.Controls 只包含 TabControl
【发布时间】:2016-12-11 09:18:56
【问题描述】:

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

 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 是否需要成为选项卡而不是表单的子项?

【问题讨论】:

  • 您不能将TabControlTabPage 指定为ContainerControlErrorProvider。你有什么要求?您想知道整个Form 的验证状态还是只知道TabControl 的特定TabPage 的验证状态?
  • 我一次只看一个 TabPage。我为每个 TabPage 设置了不同的 ErrorProvider。
  • 您不需要使用多个ErrorProvider 组件。其中一个就足够了整个表格。无论如何,如果您想检查这些控件,可以将 foreach 更改为查看 (Control c in Control c in tabControl1.TabPages[0].Controls)
  • 也看看这篇文章,你可能会发现它很有用:Validating user input / Give .NET controls status OK or NOK
  • 控件层次结构是一个,而不是一个数组或集合。树总是最好用递归遍历,使用c.Controls。或者考虑this approach

标签: c# winforms visual-studio error-handling


【解决方案1】:

TabControl 本身是一个包含 TabPages 的容器。这些 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;
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多