У меня есть собственный GridView, и я хочу установить некоторые правила для отображения ошибки.
Я хотел бы сделать что-то подобное:
var grid = new MyGridView();
grid.DataSource = new List<MyClass>();
grid.InitErrorRegistrator<MyClass>()
.RegisterRule(column1, x => x.Property1 == 12)
.RegisterRule(column2, x => x.Property2 == "Test");
Так что, когда я заполняю сетку, я ожидаю увидеть ошибку, когда я заполняю значения строки недопустимыми значениями.
У меня есть что-то вроде этого:
internal class ErrorRegistrator
{
internal GenericErrorRegistrator<T> Init<T>()
{
return new GenericErrorRegistrator<T>();
}
/*Here I think I could use methods to get values from GenericErrorRegistrator<T> dictionary like:*/
internal bool CheckRule(string column, object row)
{
return GenericErrorRegistrator.CheckRule(column, row);
}
}
public class GenericErrorRegistrator<T>
{
private readonly Dictionary<string, object> _errorRules = new Dictionary<string, object>();
internal Dictionary<string, object> ErrorRules => _errorRules;
public void RegisterErrorRule(string columnName, Func<T, bool> func)
{
_errorRules.Add(columnName, func);
}
public bool CheckRule(string column, object row)
{
Func<T, bool> func = _errorRules[column]
return func((T) row);
}
}
MyGridView
public class MyGridView : GridView
{
internal ErrorRegistrator ErrorRegistrator = new ErrorRegistrator();
/*Here I think should be something like*/
public GenericErrorRegistrator<T> InitErrorRegistrator<T>()
{
return ErrorRegistrator.Init<T>();
}
}
В конце у меня есть класс GridController, который анализирует наличие каких-либо правил и применяет его к строке:
public class MyGridCurrencyDataController : CurrencyDataController
{
public override ErrorInfo GetErrorInfo(int controllerRow, int column)
{
var info = base.GetErrorInfo(controllerRow, column);
DataColumnInfo dataColumnInfo = Columns[column];
BandedGridColumn gridColumn = GridColumns.ColumnByFieldName(dataColumnInfo.Name);
if (HasErrRules ?? false)
{
object row = _view.GetRow(controllerRow);
/*I think here I need something like this*/
bool showError = _view.ErrorRegistrator.CheckRule(gridColumn.Name, row );
if (showError)
SetError(new RowColumnErrorEventArgs(info, controllerRow, gridColumn));
else
ClearError(new RowColumnErrorEventArgs(info, controllerRow, gridColumn));
}
_view.FillRowColumnError(controllerRow, gridColumn, info);
return info;
}
}
Как мне этого достичь и возможно ли это вообще?