C#WinForms ErrorProvider控件

时间:2010-04-21 10:39:21

标签: c# winforms validation errorprovider

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

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

由于

百里

5 个答案:

答案 0 :(得分:18)

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

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; } }
}

答案 1 :(得分: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();

答案 2 :(得分:0)

这是你正在讨论的一个中等难度的解决方案。

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

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

可以用Dictionary<TKey, TValue>来跟踪它。

答案 3 :(得分:0)

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

答案 4 :(得分: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)中删除了错误。 这对我有用:)