Подтвердить что ты не робот

С# WinForms ErrorProvider Control

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

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

Спасибо

Barry

4b9b3361

Ответ 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; } }
}

Ответ 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

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

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

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

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

Ответ 4

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

Ответ 5

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