C#WinForms ErrorProvider控件

有没有人知道是否有办法获得激活ErrorProvider图标的控件列表。 即。 任何validation失败的控件。 我试图避免循环表单中的所有控件。

我想显示某种消息,指出表单上有多少错误。 由于我的表单包含选项卡,我试图让用户明白错误可能存在于非活动选项卡上,并且需要检查所有选项卡。

谢谢

巴里

这属于“你怎么知道”的范畴。 您的代码是调用ErrorProvider.SetError(),您应该可以毫不费力地跟踪仍有多少错误。 这是一个小帮助类,使用它的SetError()方法来更新ErrorProvider。 其Count属性返回活动错误的数量:

private class ErrorTracker { private HashSet mErrors = new HashSet(); private ErrorProvider mProvider; public ErrorTracker(ErrorProvider provider) { mProvider = provider; } public void SetError(Control ctl, string text) { if (string.IsNullOrEmpty(text)) mErrors.Remove(ctl); else if (!mErrors.Contains(ctl)) mErrors.Add(ctl); mProvider.SetError(ctl, text); } public int Count { get { return mErrors.Count; } } } 

今天我遇到了同样的问题。 我的解决方案是扩展ErrorProvider控件。

请参阅以下代码:

  public class MyErrorProvider : ErrorProvider { public List GetControls() { return this.GetControls(this.ContainerControl); } public List GetControls(Control ParentControl) { List ret = new List(); if (!string.IsNullOrEmpty(this.GetError(ParentControl))) ret.Add(ParentControl); foreach (Control c in ParentControl.Controls) { List child = GetControls(c); if (child.Count > 0) ret.AddRange(child); } return ret; } } 

您可以在表单中使用上面的派生类,然后(假设myErrorProvider是表单中的类实例)您可以通过调用以下方式获取表单中包含错误的所有控件:

 List errorControls = myErrorProvider.GetControls(); 

这是你正在谈论的一个中等棘手的解决方案。

据我所知,没有办法自动实现这一点。

您必须为每个控件保留一个标志,并在每次错误提供程序闪烁时手动设置它。

可以是Dictionary可用于跟踪它。

您必须首先使用SetError在控件上设置错误,对吗? 如果您想要将信息放在另一个集合中,也许您应该将它放在另一个集合中。 例如,您可以将每个控件添加错误添加到哈希集。

只需将errorprovider设置为全局变量而不是局部变量

 public partial class MainForm { ErrorProvider errorProvider1 = new ErrorProvider(); void Validate_Working() { errorProvider1.SetError(textbox1, "textbox is empty"); errorProvider1.Clear(); } } 

 public partial class MainForm { Void Validate_NotWorking() { ErrorProvider errorProvider1 = new ErrorProvider(); errorProvider1.SetError(textbox1, "textbox is empty"); errorProvider1.Clear(); } } 

这应该可以解决您的问题,因为您可能已经从其他方法(例如btnCancel_click)中删除了错误。 这对我有用:)