2010-04-21 60 views
16

有谁知道是否有方法来获取ErrorProvider图标处于活动状态的控件列表。即。任何验证失败的控件。我试图避免循环表单中的所有控件。C#WinForms ErrorProvider控件

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

感谢

巴里

回答

16

这属于“你怎么能不知道知道”。它是调用ErrorProvider.SetError()的代码,你应该没有问题跟踪有多少错误仍然有效。这里有一个小助手类,使用它的SetError()方法来更新ErrorProvider。其计数属性返回主动失误次数:

private class ErrorTracker { 
    private HashSet<Control> mErrors = new HashSet<Control>(); 
    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; } } 
} 
+0

感谢汉斯。 我有一种感觉,我将不得不这样做。根据我的时间限制,我甚至可以创建自己的自定义错误提供程序以供将来使用。 看起来这个功能应该与标准控件一起提供 - 也许这就是我。 再次感谢。 – codingbadger 2010-04-21 11:41:34

+0

嗯,是的。你明确禁止在你的问题中使用GetError()。要小心你所要求的。 – 2010-04-21 12:12:02

+2

我想我对'ErrorProvider'类的期望有点过高。尽管如此,更好的ErrorProvider可以让你查询出错的控件,检索计数等。 – IAbstract 2010-11-15 17:28:54

0

这是你所谈论的是适度棘手的解决方案。据我所知,没有办法自动实现这一点。

您必须为每个控件维护一个标志,并在每次错误提供者眨眼时手动设置它。

可能是一个Dictionary<TKey, TValue>可用于跟踪它。

0

您必须先使用SetError在控件上设置错误,对吗?也许你应该将这些信息同时存储在另一个集合中,如果你想让它得心应手的话。例如,您可以将每个带有错误的控件添加到哈希集。

+0

当使用DataBinding IDataErrorInfo接口被使用,你没有任何处理它。 – 2010-05-19 10:05:32

0

只是使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)中删除了您的错误。 这对我有用:)

5

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

请参见下面的代码:

public class MyErrorProvider : ErrorProvider 
    { 

    public List<Control> GetControls() 
    { 
     return this.GetControls(this.ContainerControl); 
    } 

    public List<Control> GetControls(Control ParentControl) 
    { 
     List<Control> ret = new List<Control>(); 

     if (!string.IsNullOrEmpty(this.GetError(ParentControl))) 
     ret.Add(ParentControl); 

     foreach (Control c in ParentControl.Controls) 
     { 
     List<Control> child = GetControls(c); 
     if (child.Count > 0) 
      ret.AddRange(child); 
     } 

     return ret; 
    } 
    } 

您可以使用您的形式上面派生类,然后(说myErrorProvider是类的实例在你的形式),你可以得到所有的控制与错误你的表单,通过调用:

List<Control> errorControls = myErrorProvider.GetControls();