Подтверждение пользовательского ввода / Предоставление состояния.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
), так далее.
Это действительно зависит от того, как глубоко вы хотите вникать в эту кроличью нору...
Вы должны принять решение о статусах проверки - если это просто случай Да / Нет, то
Boolean/bool
будет достаточно, в противном случае вам следует рассмотреть возможность создания перечисления для хранения ваших статусов проверки.Вам нужно будет решить, хотите ли вы расширить элементы управления, требующие проверки, или просто использовать элементы управления.
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;
}
}