【问题标题】:C# WinForms ErrorProvider ControlC# WinForms ErrorProvider 控件
【发布时间】:2011-02-10 13:08:21
【问题描述】:

有谁知道是否有一种方法可以获取激活 ErrorProvider 图标的控件列表。 IE。任何未通过验证的控件。我试图避免循环表单中的所有控件。

我想显示某种消息,表明表单上有多少错误。由于我的表单包含选项卡,因此我试图让用户清楚地看到非活动选项卡上可能存在错误,他们需要检查所有选项卡。

谢谢

巴里

【问题讨论】:

    标签: c# winforms validation errorprovider


    【解决方案1】:

    这属于“你怎么知道”的类别。调用 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; } }
    }
    

    【讨论】:

    • 谢谢汉斯。我有一种感觉,我必须做这样的事情。根据我的时间限制,我什至可以创建自己的自定义错误提供程序以供将来使用。看起来这个功能应该可以在标准控件中使用——也许这只是我。再次感谢。
    • 嗯,是的。您明确禁止在您的问题中使用 GetError() 。小心你的要求。
    • 我想我对ErrorProvider 课程的期望有点过高。更好的 ErrorProvider 可以让您查询有错误的控件、检索计数等。不过,例如 +1。
    • 在您的 SetError() 方法中,您应该将 else 子句修改为
    【解决方案2】:

    今天我遇到了同样的问题。我的解决方案是扩展 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();
    

    【讨论】:

      【解决方案3】:

      只需将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)中删除了错误。 这对我有用:)

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 当使用 DataBinding 时,会使用 IDataErrorInfo-Interface,您无需处理它。
        【解决方案5】:

        这是你所说的一个比较棘手的解决方案。

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

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

        可能是Dictionary&lt;TKey, TValue&gt; 可以用来跟踪它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-11
          • 1970-01-01
          • 2011-11-15
          • 1970-01-01
          • 1970-01-01
          • 2014-12-25
          相关资源
          最近更新 更多