在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?

在ColumnChanging事件中验证数据集

根据你链接的文档,你不想覆盖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(…)。