如何:向 N 层数据集添加验证
向分布在 N 层解决方案中的数据集添加验证与向单文件数据集(单个项目中的数据集)添加验证的过程基本相同。 建议您在数据表的 ColumnChanging 和/或 RowChanging 事件过程中对数据执行验证。
数据集设计器提供了创建分部类的功能,在分部类中,可对数据集中的数据表的列和行更改事件添加用户代码。 有关向 N 层解决方案中的数据集添加代码的更多信息,请参见如何:向 N 层应用程序的数据集添加代码和如何:向 N 层应用程序中的 TableAdapter 添加代码。 有关分部类的更多信息,请参见如何:将类拆分为分部类(类设计器)或分部类和方法(C# 编程指南)。
提示
分离数据集与 TableAdapter 时(通过设置“数据集项目”属性),将不会自动移动项目中现有的数据集分部类。 您必须手动将它们移到数据集项目中。
提示
数据集设计器不会自动在 C# 中为 ColumnChanging 和 RowChanging 事件创建事件处理程序。 您必须手动创建事件处理程序并将事件处理程序与基础事件挂钩。 下面的过程提供了在 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 中那样自动为 ColumnChanging 和 RowChanging 事件创建事件处理程序。 在 C# 项目中,您必须手动构造方法以处理事件并将该方法与基础事件挂钩。 下面的过程提供了在 Visual Basic 和 C# 中创建所需事件处理程序的步骤。
提示
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。
添加单个列的值更改过程中的验证
通过在解决方案资源管理器中双击**“.xsd”**文件,在数据集设计器中打开数据集。 有关更多信息,请参见如何:在数据集设计器中打开数据集。
双击要验证的列。 此操作将创建 ColumnChanging 事件处理程序。
提示
数据集设计器不会自动为 C# 事件创建事件处理程序。 下面包含了在 C# 中处理事件所必需的代码。 将创建 SampleColumnChangingEvent,然后在 EndInit 方法中将它与 ColumnChanging 事件挂钩。
添加代码以验证 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 事件创建事件处理程序。
添加整行更改过程中的验证
通过在解决方案资源管理器中双击**“.xsd”**文件,在数据集设计器中打开数据集。 有关更多信息,请参见如何:在数据集设计器中打开数据集。
在设计器上双击数据表的标题栏。
含有 RowChanging 事件处理程序的分部类将被创建,并在代码编辑器中打开。
提示
数据集设计器不会自动在 C# 项目中为 RowChanging 事件创建事件处理程序。 您必须创建一个方法以处理 RowChanging 事件,并在表的初始化方法中执行代码以挂钩该事件。
在分部类声明中添加用户代码。
下面的代码演示在何处添加用户代码以在 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
下面的代码演示如何创建 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 = ""; } } }