C # WinForms ErrorProvider Control - PullRequest
       16

C # WinForms ErrorProvider Control

17 голосов
/ 21 апреля 2010

Кто-нибудь знает, есть ли способ получить список элементов управления, у которых активен значок ErrorProvider. то есть. любые элементы управления, которые не прошли проверку. Я пытаюсь избежать зацикливания всех элементов управления в форме.

Я хотел бы отобразить какое-то сообщение, указывающее, сколько ошибок в форме. Поскольку моя форма содержит вкладки, я стараюсь сделать так, чтобы пользователю было очевидно, что на неактивных вкладках могут существовать ошибки, и им необходимо проверить все вкладки.

Спасибо

Barry

Ответы [ 5 ]

18 голосов
/ 21 апреля 2010

Это относится к категории "как можно не знать". Это ваш код, который вызывает 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; } }
}
5 голосов
/ 31 июля 2012

Сегодня у меня была такая же проблема. Мое решение заключается в расширении элемента управления 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();
0 голосов
/ 09 марта 2012

Просто сделайте провайдер ошибок в качестве глобальной переменной, а не локальной переменной

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. Это сработало для меня :)

0 голосов
/ 21 апреля 2010

Вы должны использовать SetError, чтобы сначала установить ошибку на элементе управления, верно? Возможно, вам следует хранить эту информацию в другой коллекции одновременно, если вы хотите, чтобы она была под рукой. Например, вы можете добавить каждый элемент управления с ошибкой в ​​хэш-набор.

0 голосов
/ 21 апреля 2010

Это умеренно сложное решение, о котором вы говорите.

Насколько я знаю, нет способа достичь этого автоматически.

Необходимо поддерживать флаг для каждого элемента управления и устанавливать его каждый раз, когда мигает поставщик ошибок.

Может быть Dictionary<TKey, TValue> может использоваться для отслеживания этого.

...