Вопрос

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

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

Спасибо

Барри

Это было полезно?

Решение

Это падает в категорию "Как вы можете нет Знайте ". Это ваш код, который вызывает regreprovider.seetError (), у вас не должно быть никаких проблем отслеживать, сколько ошибок все еще активно. Вот маленький класс помощника, используйте свой метод 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; } }
}

Другие советы

Сегодня у меня была такая же проблема. Мое решение состоит в том, чтобы расширить контроль 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;
    }
  }

Вы можете использовать вышеупомянутый класс в своей форме, а затем (скажем, что MyErrorrovider - это экземпляр класса в вашей форме) Вы можете получить все элементы управления с ошибками в своей форме, позвонив:

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top