WinForms/.NETFramework: форматирование DataGridViewCell в соответствии с ValidationResultC#

Место общения программистов C#
Anonymous
WinForms/.NETFramework: форматирование DataGridViewCell в соответствии с ValidationResult

Сообщение Anonymous »

Рассмотрим небольшое приложение Winforms, в котором есть список пользовательских объектов, привязанных к DataGridView.
Класс данных:

Код: Выделить всё

public class MyAwesomeClass : IDataErrorInfo, INotifyPropertyChanged{
string _Name;
public string Name { get { return _Name; } set { if(Name is null || !Name.Equals(value)) { _Name = value; Changed(nameof(Name)); } } }

int _MyVal;
[CustomValidation(typeof(MyAwesomeValidator), nameof(MyAwesomeValidator.ValidateIntVal))]
public int MyVal { get { return _MyVal; } set { if(!MyVal.Equals(value)) { _MyVal = value; Changed(nameof(MyVal)); } } }

private void Changed(string property) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); }

//Nicked from: https://reza-aghaei.com/dataannotations-validation-attributes-in-windows-forms/
[Browsable(false)]
public string this[string property]
{
get
{
var propertyDescriptor = TypeDescriptor.GetProperties(this)[property];
if (propertyDescriptor == null)
return string.Empty;

var results = new List();
var result = Validator.TryValidateProperty(
propertyDescriptor.GetValue(this),
new ValidationContext(this, null, null)
{ MemberName = property },
results);
if (!result)
return results.First().ErrorMessage;
return string.Empty;
}
}

[Browsable(false)]
public string Error
{
get
{
var results = new List();
var result = Validator.TryValidateObject(this,
new ValidationContext(this, null, null), results, true);
if (!result)
return string.Join(Environment.NewLine, results.Select(x => x.ErrorMessage));
else
return null;
}
}

public static IEnumerable DummyData {get{return new []{
new MyAwesomeClass("a",-2),
new MyAwesomeClass("b",3),
new MyAwesomeClass("c",8)
};}}

}
Пользовательский результат проверки:

Код: Выделить всё

public class CustomValidationResult : ValidationResult {
public enum ResultState { Warning, Error}

public ResultState State {get; private set;}

public CustomValidationResult(string errorMessage, ResultState state):base(errorMessage) {
ResultState = state;
}
public static ValidationResult Success {get{return ValidationResult.Success;}}
}
Валидатор:

Код: Выделить всё

public class MyAwesomeValidator{
public static ValidationResult ValidateIntVal(int value, ValidationContext Context) {
if(value < 0) return new CustomValidationResult("The value cannot be smaller than 0", CustomValidationResult.ResultState.Error);
if(value

Вернуться в «C#»