Валидация данных
Механизм валидации данных позволяет проверять значения ячеек и показывать ошибки в ячейках, содержащих недопустимые данные.
Контролы TreeList и TreeView выполняют валидацию данных, когда пользователь изменяет значение ячейки, а затем пытается сохранить (опубликовать) это значение. Контролы также запускают механизм валидации для вновь отображаемых ячеек и ячеек, обновленных в коде, даже если пользователь не изменял значения ячеек.
Проверка значений при изменении пользователем данных ячейки
Контролы TreeList и TreeView активируют механизм валидации значений ячеек, когда пользователь изменяет значение ячейки и пытается сохранить его в источнике данных (например, пользователь нажимает клавишу ENTER или перемещает фокус на другую ячейку). На следующей диаграмме показаны этапы механизма валидации, выполняемые, когда пользователь изменяет значение ячейки:
Встроенный редактор ячейки выполняет валидацию начального значения во время ввода данных. Например,
SpinEditor
, который принимает только числовые значения, показывает ошибки, если пользователь пытается ввести букву.Пользователь не может покинуть ячейку до тех пор, пока не будет введено допустимое значение или нажата клавиша ESC, которая возвращает предыдущее значение.
Контрол TreeList/TreeView проверяет, применяются ли Атрибуты DataAnnotations к бизнес-объекту источника данных, а затем проверяет данные в соответствии с этими правилами. Этот этап валидации включен, если свойством
DataControlBase.ShowItemsSourceErrors
являетсяtrue
(значение по умолчанию).Пользователь не может покинуть ячейку до тех пор, пока не будет введено допустимое значение или нажата клавиша ESC, которая возвращает предыдущее значение.
Контрол запускает Событие
DataControlBase.ValidateCellValue
, которое вы можете обработать для реализации валидации пользовательского значения.Пользователь не может покинуть ячейку до тех пор, пока не будет введено допустимое значение или нажата клавиша ESC, которая возвращает предыдущее значение.
Контрол публикует значение ячейки. На этом шаге источник данных может вызывать исключения, если опубликованные данные неверны. Контрол показывает ошибку в ячейке, если перехватывается какое-либо исключение.
Пользователь не может покинуть ячейку до тех пор, пока не будет введено допустимое значение или нажата клавиша ESC, которая возвращает предыдущее значение.
Контрол TreeList/TreeView проверяет, реализует ли бизнес-объект Интерфейс
IDataErrorInfo
, и извлекает ошибки ячейки, если таковые имеются, используя свойствоIDataErrorInfo.Item[String]
. Этот этап валидации включен, если свойствомDataControlBase.ShowItemsSourceErrors
являетсяtrue
(значение по умолчанию).Контрол позволяет пользователю покинуть ячейку, если значение ячейки является недопустимым, поскольку значение уже было разнесено.
Проверка значений вновь отображаемых ячеек и ячеек, обновляемых в коде
Контролы поддерживают механизм валидации для вновь отображаемых и обновленных ячеек, даже если пользователь не изменял значения ячеек. Контрол проверяет значения ячеек в следующих случаях:
- Первоначально отображается контрол, и поэтому ячейки рисуются в пределах области просмотра.
- Ячейка становится видимой при прокрутке контрола.
- Значение ячейки изменяется в коде, и поэтому контролу необходимо перерисовать ячейку.
На следующей диаграмме показаны этапы механизма валидации в этих сценариях:
Контрол TreeList/TreeView проверяет, применяются ли Атрибуты DataAnnotations к бизнес-объекту источника данных, а затем проверяет данные в соответствии с этими правилами. Этот этап валидации включен, если свойством
DataControlBase.ShowItemsSourceErrors
являетсяtrue
(значение по умолчанию).Контрол TreeList/TreeView проверяет, реализует ли бизнес-объект Интерфейс
IDataErrorInfo
, и извлекает ошибки ячейки, если таковые имеются, используя свойствоIDataErrorInfo.Item[String]
. Этот этап валидации включен, если свойствомDataControlBase.ShowItemsSourceErrors
являетсяtrue
(значение по умолчанию).Контрол запускает Событие
DataControlBase.ValidateCellValue
, которое вы можете обработать для реализации валидации пользовательского значения. Этот этап валидации включен, если свойствомDataControlBase.ValidateCellValuesOnShowAndUpdate
являетсяtrue
(значение по умолчанию -false
).
Правила валидации источника данных
Если свойство DataControlBase.ShowItemsSourceErrors
включено (дефолтное поведение), контрол TreeList/TreeView проверяет данные, используя атрибуты DataAnnotations
и интерфейс IDataErrorInfo
, применяемые к бизнес-объекту источника данных.
Атрибуты DataAnnotations
Вы можете применить атрибуты валидации DataAnnotations
(потомки System.ComponentModel.DataAnnotations.ValidationAttribute
) к бизнес-объекту, чтобы указать правила валидации для свойств объекта. В приведенном ниже списке приведены наиболее распространенные атрибуты валидации:
CompareAttribute
— Предоставляет атрибут, который сравнивает два свойства.CustomValidationAttribute
— Указывает пользовательский метод валидации, который используется для проверки свойства или экземпляра класса.MaxLengthAttribute
— Указывает максимальную длину массива или строковых данных, допустимую в свойстве.MinLengthAttribute
— Указывает минимальную длину массива или строковых данных, допустимую в свойстве.RangeAttribute
— Задает ограничения числового диапазона для значения поля данных.RegularExpressionAttribute
— Указывает, что значение поля данных должно соответствовать указанному регулярному выражению.RequiredAttribute
— Указывает, что требуется значение поля данных.StringLengthAttribute
— Указывает минимальную и максимальную длину символов, которые допустимы в поле данных.
Пример
Следующий код применяет атрибут StringLength
к свойству Code бизнес-объекта. Атрибут заставляет пользователя вводить строку, содержащую не менее 4, но не более 8 символов.
public partial class Department : ObservableObject, IDataErrorInfo
{
//...
[ObservableProperty]
[property: StringLength(8, MinimumLength = 4)]
public string code = "0000";
}
Интерфейс IDataErrorInfo
Вы можете реализовать следующее System.ComponentModel.IDataErrorInfo
интерфейс для бизнес-объекта для указания правил валидации свойств бизнес-объекта.
В настоящее время контролы TreeList и TreeView поддерживают ошибки только для отдельных ячеек, а не для целых строк. Таким образом, действует только свойство IDataErrorInfo.Item[String]
, а свойство IDataErrorInfo.Error
игнорируется.
Пример
В следующем примере реализован IDataErrorInfo
для бизнес-объекта, который возвращает ошибку, если свойство Phone пусто.
public partial class Department : ObservableObject, IDataErrorInfo
{
//...
[ObservableProperty]
public string phone = "0";
string IDataErrorInfo.this[string columnName]
{
get
{
if (columnName != "Phone")
return "";
return string.IsNullOrEmpty(this.Phone) ? "Please specify the phone number" : "";
}
}
string IDataErrorInfo.Error
{
get { return ""; }
}
}
Событие ValidateCellValue для контрола
Событие DataControlBase.ValidateCellValue
позволяет вам реализовать логику валидации пользовательских значений.
Инициирование события DataControlBase.ValidateCellValue
является необязательным этапом механизма валидации, вызываемого после того, как пользователь изменил значение ячейки.
Механизм валидации также используется для проверки достоверности вновь отображаемых ячеек и ячеек, обновленных в коде. В этом случае событие DataControlBase.ValidateCellValue
срабатывает только в том случае, если унаследованным свойством DataControlBase.ValidateCellValuesOnShowAndUpdate
является true
(значение по умолчанию - false
).
Пример
Следующий пример обрабатывает событие ValidateCellValue
, чтобы показывать ошибки, когда значение свойства Date1 больше значения свойства Date2.
public partial class Department : ObservableObject, IDataErrorInfo
{
[ObservableProperty]
public DateTime date1 = new DateTime();
[ObservableProperty]
public DateTime date2 = new DateTime();
}
treeList1.ValidateCellValue += TreeList1_ValidateCellValue;
// Uncomment the following code line to use the ValidateCellValue event handler
// to check cells when they are displayed or modified in code:
// treeList1.ValidateCellValuesOnShowAndUpdate = true;
private void TreeList1_ValidateCellValue(object? sender, TreeListValidateCellValueEventArgs e)
{
Department dep = e.Node.Content as Department;
if(e.Column.FieldName == "Date1")
{
DateTime value1 = Convert.ToDateTime(e.Value);
DateTime value2 = dep.Date2;
if(value1 > value2)
{
e.ErrorContent = "Date1 must be less than Date2";
return;
}
}
}
* Эта страница была создана автоматически с помощью сервиса машинного перевода Яндекс Переводчик.