Подтверждение пользовательского ввода / Предоставление состояния.NET элементов управления OK или NOK

Я думаю о лучшем способе проверки ввода пользователя.

Давайте представим некоторые TextBoxes, CheckBoxes или любой другой элемент управления.NET, который вы хотите, где пользовательский ввод должен быть проверен как OK или NOK. Как только пользователь заполняет все необходимые поля, он отправляет через кнопку.

Теперь я должен знать, какие поля были ранее подтверждены как ОК, а какие как NOK. К настоящему времени я всегда обрабатывал такие случаи, объявляя глобальную переменную bool для каждого элемента управления, чтобы сказать мне об этом. Но мне это не нравится...

Я уверен, что должен быть другой путь! Я хотел бы расширить эти элементы управления.NET с помощью свойства OK или NOK, называемого status или аналогичным. Вы можете сделать это? И если так, как ты это делаешь? Что-то подобное уже существует?

Благодарю за ваш ответ!

4 ответа

Решение

У вас есть несколько полезных средств в формах Windows для выполнения проверки и отображения сообщений об ошибках, в том числе:

  • IDataErrorInfo Интерфейс
  • Validating Событие Контроля
  • ErrorProvider Составная часть
  • ValidateChildren Метод и AutoValidate Свойство формы

Используя вышеуказанные параметры:

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

Интерфейс IDataErrorInfo

В тех случаях, когда у вас есть некоторые классы моделей, лучше всего подходит для проверки и предоставления сообщений об ошибках в формах Windows. IDataErrorInfo, Он поддерживается механизмами привязки данных и некоторыми элементами управления окнами, такими как DataGridView а также ErrorProvider,

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

Вы будете использовать ErrorProvider показывать сообщения об ошибках. Достаточно связать его с вашим источником данных, и он автоматически показывает ошибки.

Валидация события элементов управления

В тех случаях, когда у вас нет классов моделей и все проверки должны проводиться в отношении элементов управления, лучшим вариантом является использование Validating событие управления. Там вы можете установить e.Cancel = true установить состояние управления как недействительное. Затем вы можете предотвратить изменение фокуса или использовать состояние контроля при получении сводки проверки.

В этом случае вы будете использовать ErrorProvider показать ошибки. Достаточно установить ошибку для элемента управления в Validating событие таким образом: errorProvider1.SetError(control1, "Some Error") или вы можете установить пустое сообщение об ошибке, чтобы удалить ошибку проверки.

Компонент ErrorProvider
В обоих случаях, когда вы используете привязку данных или когда вы используете Validating событие, как упоминалось выше, ErrorProvider показывает и значок ошибки с всплывающей подсказкой, которая показывает сообщение об ошибке рядом с элементами управления. (DataGridView использует собственный механизм для отображения ошибок в строках и ячейках, не используя ErrorProvider.)

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

Метод ValidateChildren и свойство AutoValidate формы

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

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

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

var elements = new[] {
    new { Control = textBox1 },
    new { Control = textBox2 }
};

foreach (var elem in elements)
{
    elem.Control.BackColor = string.IsNullOrWhiteSpace(elem.Control.Text) ? Color.Yellow : Color.White;
}

Оберните ваш массив Elem в объекты класса, чтобы добавить свойство "ok".

Все компоненты winforms имеют "запасное" свойство, которое вы можете использовать: Tag, Это object и вы можете присвоить ему все, что угодно: это ни для чего не используется фреймворком, и это полезно для подобных случаев.

Если это будет обобщено, вы можете просто получить свои элементы управления и добавить свои свойства, но для одноразового однозначного свойства, Tag может отлично работать.

// OK
myTextBox.Tag = true;
// NOK
myTextBox.Tag = false;
// Undefined
myTextBox.Tag = null;

Проверять:

if(myTextBox.Tag is bool)
{
  var isOk = (bool)myTextBox.Tag;     
  if(isOk) 
  {
    // It's OK
  } else {
    // It's NOK
  }
} else {
  // It's undefined
}

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

public class MyTextBox : System.Windows.Forms.TextBox
{
  public bool ValidationOK { get; set; }
}

И измените элементы управления на MyTextBox (если они у вас уже есть, откройте designer.cs подать и изменить все экземпляры System.Windows.Forms.TextBox в <yourNamespace>.MyTextBox), так далее.

Это действительно зависит от того, как глубоко вы хотите вникать в эту кроличью нору...

  1. Вы должны принять решение о статусах проверки - если это просто случай Да / Нет, то Boolean/bool будет достаточно, в противном случае вам следует рассмотреть возможность создания перечисления для хранения ваших статусов проверки.

  2. Вам нужно будет решить, хотите ли вы расширить элементы управления, требующие проверки, или просто использовать элементы управления. Tag свойство для хранения статуса проверки (лично я думаю, что с помощью Tag делать это отвратительно).

Пример:

// Provides your validation statuses.
public enum ControlValidation
{
    Ok,
    NotOk
}

// Provides a contract whereby your controls implement a validation property, indicating their status.
public interface IValidationControl
{
    ControlValidation ValidationStatus { get; private set; }
}

// An example of the interface implementation...
public class TextBox : System.Windows.Forms.TextBox, IValidationControl
{
    public ControlValidation ValidationStatus { get; private set; }

    ...

    protected override void OnTextChanged(EventArgs e)
    {
        ValidationStatus = ControlValidation.Ok;
    }
}
Другие вопросы по тегам