如何:向 N 层数据集添加验证

向分布在 N 层解决方案中的数据集添加验证与向单文件数据集(单个项目中的数据集)添加验证的过程基本相同。建议您在数据表的 ColumnChanging 和/或 RowChanging 事件过程中对数据执行验证。

创建和编辑类型化数据集提供了创建分部类的功能,在分部类中,可对数据集中的数据表的列和行更改事件添加用户代码。有关向 N 层解决方案中的数据集添加代码的更多信息,请参见如何:向 N 层应用程序的数据集添加代码如何:向 N 层应用程序中的 TableAdapter 添加代码。有关分部类的更多信息,请参见如何:将类拆分为分部类(类设计器)分部类和方法(C# 编程指南)

说明说明

分离数据集与 TableAdapter 时(通过设置“数据集项目”属性),将不会自动移动项目中现有的数据集分部类。您必须手动将它们移到数据集项目中。

说明说明

数据集设计器不会自动在 C# 中为 ColumnChangingRowChanging 事件创建事件处理程序。您必须手动创建事件处理程序并将事件处理程序与基础事件挂钩。下面的过程提供了在 Visual Basic 和 C# 中创建所需事件处理程序的步骤。

验证单个列的更改

通过处理 ColumnChanging 事件可验证单列中的值。修改列中的值时会引发 ColumnChanging 事件。在创建和编辑类型化数据集上双击所需列可为 ColumnChanging 事件创建事件处理程序。

首次双击一列时,设计器会为 ColumnChanging 事件生成事件处理程序。除了 ColumnChanging 事件之外,还会创建用于测试特定列的 If…Then 语句。例如,双击 Northwind Orders 表的 RequiredDate 列后会生成以下代码:

Private Sub OrdersDataTable_ColumnChanging(ByVal sender As System.Object, ByVal e As System.Data.DataColumnChangeEventArgs) Handles Me.ColumnChanging
    If (e.Column.ColumnName = Me.RequiredDateColumn.ColumnName) Then
        ' Add validation code here.
    End If
End Sub
说明说明

在 C# 项目中,数据集设计器仅创建用于数据集的分部类以及数据集中的各个表。在 C# 中,数据集设计器不会像在 Visual Basic 中那样自动为 ColumnChangingRowChanging 事件创建事件处理程序。在 C# 项目中,您必须手动构造方法以处理事件并将该方法与基础事件挂钩。下面的过程提供了在 Visual Basic 和 C# 中创建所需事件处理程序的步骤。

说明说明

对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置

添加单个列的值更改过程中的验证

  1. 通过在解决方案资源管理器中双击**“.xsd”**文件,在创建和编辑类型化数据集中打开数据集。有关更多信息,请参见如何:在数据集设计器中打开数据集

  2. 双击要验证的列。此操作将创建 ColumnChanging 事件处理程序。

    说明说明

    数据集设计器不会自动为 C# 事件创建事件处理程序。下面包含了在 C# 中处理事件所必需的代码。将创建 SampleColumnChangingEvent,然后在 EndInit 方法中将它与 ColumnChanging 事件挂钩。

  3. 添加代码以验证 e.ProposedValue 中包含的数据是否满足您应用程序的要求。如果建议的值不可接受,请设置该列,指示其包含一个错误。

    下面的代码示例验证 Quantity 列的值是否大于 0。如果 Quantity 的值小于或等于 0,则该列设置为有错。如果 Quantity 的值大于 0,Else 子句将清除错误。列更改事件处理程序中的代码应如下所示:

    If (e.Column.ColumnName = Me.QuantityColumn.ColumnName) Then
        If CType(e.ProposedValue, Short) <= 0 Then
            e.Row.SetColumnError(e.Column, "Quantity must be greater than 0")
        Else
            e.Row.SetColumnError(e.Column, "")
        End If
    End If
    
    // C#
    // Add this code to the DataTable 
    // partial class.
    
        public override void EndInit()
        {
            base.EndInit();
            // Hook up the ColumnChanging event
            // to call the SampleColumnChangingEvent method.
            ColumnChanging += SampleColumnChangingEvent;
        }
    
        public void SampleColumnChangingEvent(object sender, System.Data.DataColumnChangeEventArgs e)
        {
            if (e.Column.ColumnName == QuantityColumn.ColumnName)
            {
                if ((short)e.ProposedValue <= 0)
                {
                    e.Row.SetColumnError("Quantity", "Quantity must be greater than 0");
                }
                else
                {
                    e.Row.SetColumnError("Quantity", "");
                }
            }
        }
    

验证整行的更改

通过处理 RowChanging 事件可验证整行中的值。提交所有列中的值后,将引发 RowChanging 事件。当一列中的值依赖于另一列中的值时,有必要在 RowChanging 事件中进行验证。以 Northwind 的 Orders 表中的 OrderDate 和 RequiredDate 为例。输入 Orders 表的订单记录时,验证可确保所输入订单的 RequiredDate 不在 OrderDate 之前或与 OrderDate 相同。在本示例中,需要比较 RequiredDate 列和 OrderDate 列的值,因此验证单个列更改没有意义。

创建和编辑类型化数据集中,双击表的标题栏中的表名称可为 RowChanging 事件创建事件处理程序。

添加整行更改过程中的验证

  1. 通过在解决方案资源管理器中双击**“.xsd”**文件,在创建和编辑类型化数据集中打开数据集。有关更多信息,请参见如何:在数据集设计器中打开数据集

  2. 在设计器上双击数据表的标题栏。

    含有 RowChanging 事件处理程序的分部类将被创建,并在代码编辑器中打开。

    说明说明

    数据集设计器不会自动在 C# 项目中为 RowChanging 事件创建事件处理程序。您必须创建一个方法以处理 RowChanging 事件,并在表的初始化方法中执行代码以挂钩该事件。

  3. 在分部类声明中添加用户代码。

  4. 下面的代码演示在何处添加用户代码以在 Visual Basic 的 RowChanging 事件过程中进行验证:

    Partial Class OrdersDataTable
        Private Sub OrdersDataTable_OrdersRowChanging(ByVal sender As System.Object, ByVal e As OrdersRowChangeEvent) Handles Me.OrdersRowChanging
            ' Add logic to validate columns here.
            If e.Row.RequiredDate <= e.Row.OrderDate Then
                ' Set the RowError if validation fails.
                e.Row.RowError = "Required Date cannot be on or before the OrderDate"
            Else
                ' Clear the RowError when validation passes.
                e.Row.RowError = ""
            End If
        End Sub
    End Class
    
  5. 下面的代码演示如何创建 RowChanging 事件处理程序以及在何处添加用户代码以在 C# 的 RowChanging 事件过程中进行验证:

    partial class OrdersDataTable
    {
        public override void EndInit()
        {
            base.EndInit();
            // Hook up the event to the
            // RowChangingEvent method.
            OrdersRowChanging += RowChangingEvent;
        }
    
        public void RowChangingEvent(object sender, OrdersRowChangeEvent e)
        {
            // Perfom the validation logic.
            if (e.Row.RequiredDate <= e.Row.OrderDate)
            {
                // Set the row to an error when validation fails.
                e.Row.RowError = "Required Date cannot be on or before the OrderDate";
            }
            else
            {
                // Clear the RowError if validation passes.
                e.Row.RowError = "";
            }
        }
    }
    

请参见

任务

演练:创建 N 层数据应用程序

概念

Visual Studio 2012 中针对数据应用程序开发的新增功能

N 层数据应用程序概述

验证数据集中的数据