首页 > 解决方案 > C# 错误提供程序不适用于 groupbox 和 tabcontrols 中的文本框

问题描述

我正在尝试使用错误提供程序来验证我的文本框在继续执行之前是否为空。

错误提供程序适用于主窗体上的文本框,但拒绝适用于组框或选项卡控件中的任何文本框或组合框。它不检查文本框,不显示错误或等到用户为正在检查的控件输入文本/选择项。

当然,如果我松开 groupbox 或 tabcontrol,我会让错误检查正常工作,但我也会失去按预期为我的应用程序使用 groupbox 和 tab 控件的好处。

我正在使用下面的代码来检查文本框或组合框是否为空/空。

一些帮助将不胜感激,这让我几乎想把我的电脑扔出窗外。

private void button3_Click(object sender, EventArgs e)
{
       //Validate the text box in the form before proceeding to store in Database
       // var emptyornull = Controls.OfType<TextBox>().Where(box => box.Name.StartsWith("_")).OrderBy(box => box.TabIndex);
       // var emptyornull2 = Controls.OfType<ComboBox>().Where(box => box.Name.StartsWith("_")).OrderBy(box => box.TabIndex);

        var boxes = Controls.OfType<TextBox>();

        foreach (var testControl in boxes)
        {
            if (string.IsNullOrEmpty(testControl.Text))
            {
                this.errorProvider1.SetError((Control)testControl, "error");
                return;
            }

            this.errorProvider1.SetError((Control)testControl, (string)null);
        }
}

样本表格的图片

标签: c#tabcontrolgroupboxerrorprovider

解决方案


这是因为您的代码不检查子控件,而只检查顶级控件。您需要递归地遍历表单的控件:

private IEnumerable<Control> GetAllControls(Control control)
{
    var controls = control.Controls.Cast<Control>();
    return controls.SelectMany(ctrl => GetAllControls(ctrl)).Concat(controls);
}

private void button1_Click(object sender, EventArgs e)
{
    errorProvider1.Clear();
    foreach (Control c in GetAllControls(this))
    {
        if (c is TextBox && string.IsNullOrEmpty(c.Text))
            errorProvider1.SetError(c, "Error");
    }
}

或者,Linq 方式:

errorProvider1.Clear();

GetAllControls(this).Where(c => c is TextBox && string.IsNullOrEmpty(c.Text))
    .ToList()
    .ForEach(c => errorProvider1.SetError(c, "Error"));

祝你好运。


推荐阅读