c# - 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);
}
}
解决方案
这是因为您的代码不检查子控件,而只检查顶级控件。您需要递归地遍历表单的控件:
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"));
祝你好运。
推荐阅读
- java - 是否有另一种方法可以在不使用转义序列的情况下生成引号?
- php - 无法创建 Wordpress 子主题
- ios - Xcode 11 UILaunchImages 已被弃用,请改用启动情节提要警告
- javascript - 如何修复从 api 传入的数据以在表格中正确显示?
- python - 如何减少基于 Spacy 的 Python 应用程序的安装大小
- ruby - 法拉第宝石未解压缩响应体
- c# - 选择标签助手不渲染属性
- nuxt.js - Nuxt 响应式聊天应用的最佳路由
- typescript - 如何对动态方法进行类型检查?
- jenkins - 如果黄瓜场景通过率为 80%,如何让 jenkins 构建通过