在ColumnChanging事件中验证数据集
本文关键字:验证 数据集 事件 ColumnChanging | 更新日期: 2023-09-27 18:15:31
在包含DataSet事件的部分类中,我有以下内容:
protected override void OnColumnChanging(System.Data.DataColumnChangeEventArgs e)
{
switch (e.Column.ColumnName)
{
case "ColumnA":
{
int value = GetValue(e.ProposedValue.ToString());
if (value == -1)
{
e.Row.SetColumnError("ColumnA", string.Format("ColumnA could not map [{0}] to a valid value", e.ProposedValue));
//e.ProposedValue = "";
}
break;
}
base.OnColumnChanging(e);
}
当我检查错误并获取我的行的列错误时,当GetValue(…)返回-1时,我看到了相应的消息。我还看到,包含坏数据的列仍然包含那个坏值。我的印象是,调用SetColumnError(…)将拒绝对该列(ColumnA)所做的更改,详见:如何:在列更改期间验证数据
通过设置列错误来拒绝建议的值(SetColumnError)从更改列的事件处理程序中。
所以当我尝试这样做时:
TypedDataSet set = new TypedDataSet();
TypedDataTable.TypedDataRow row = set.TypedDataTable.NewRow();
row.ColumnA = "Bad Data";
set.TypedDataTable.AddTypedDataRow(row);
我将看到验证代码执行,但是ColumnA的值保留为:"Bad Data"。如果我设置e.p ouposdvalue = null,我可以看到值的变化。
为RowsChanging或ColumnsChanging添加事件处理程序也会产生类似的结果。
public override void BeginInit()
{
base.BeginInit();
TypedRowChanging += new TypedRowChangeEventHandler(TypedDataTable_TypedRowChanging);
ColumnChanging += new DataColumnChangeEventHandler(TypedDataTable_ColumnChanging);
}
两个事件处理程序中的代码都很简单,并且将调用e.w row。SetColumnError(" column ", "some error")。所以我最初的问题仍然是:
在列上设置列错误的情况下应该发生什么?是否应该保留值,变为null, 42?
根据你链接的文档,你不想覆盖OnColumnChanged -你想为ColumnChanged事件添加一个事件处理程序。尝试使用这里提供的示例代码作为起点。
经过大量的测试和工作,我得出结论,当在特定列上设置列错误时,列保留该值。我目前的解决方案是检查整个数据集上的错误,然后继续将这些错误聚合成错误处理的格式
TypedDataSet set = new TypedDataSet();
TypedDataTable.TypedDataRow row = set.TypedDataTable.NewRow();
row.ColumnA = "Bad Data";
set.TypedDataTable.AddTypedDataRow(row);
// At this point the DataSet has column errors and can be checked for...
if (set.HasErrors)
{
// Build some error string container here
TypedDataSet.TypedDataRow row = tempSet.TypedDataTable.Single();
var errors = from column in row.GetColumnsInError()
select row.GetColumnError(column);
foreach (var error in errors)
{
// Add to error container here
}
}
之后,我检查我的错误容器中是否有任何数据。我认为这是有意义的列保留值,以便程序员可以访问该值,并可以包括它在调用SetColumnError(…)。