如何:將驗證加入 N-Tier 資料集
發行︰ 2016年4月
在區分成 N-Tier 方案的資料集中加入驗證,基本上和將驗證加入至單一檔案資料集 (單一專案中的一個資料集) 是一樣的。 對資料執行驗證的建議位置,是在資料表的 ColumnChanging 和 (或) RowChanging 事件期間。
建立和編輯具類型資料集提供可建立部分類別的功能,您可以在此將使用者程式碼加入資料集之資料表的資料行和資料列變更事件。 如需將程式碼加入至 N-Tier 方案之資料集的詳細資訊,請參閱 如何:將程式碼加入 N-Tier 應用程式中的資料集和 如何:將程式碼加入 N-Tier 應用程式中的 TableAdapters。 如需部分類別的詳細資訊,請參閱 How to: Split a Class into Partial Classes (Class Designer)或部分類別和方法。
注意
當您藉由設定 [資料集專案] 屬性分隔 TableAdapter 和資料集時,專案中現有的部分資料集類別不會自動移動。 您必須將現有的資料集部分類別手動移至資料集專案。
注意
[DataSet 設計工具] 不會在 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# 專案中,[DataSet 設計工具] 只會為資料集和資料集中的個別資料表建立部分類別。 [DataSet 設計工具] 在 C# 中不會自動為 ColumnChanging 和 RowChanging 事件建立事件處理常式,但在 Visual Basic 中則會。 在 C# 專案中,您必須手動建構處理事件的方法,並將方法連結至基礎事件。 下列程序提供在 Visual Basic 和 C# 中建立所需之事件處理常式的步驟。
注意
在下列指示的某些 Visual Studio 使用者介面項目中,您的電腦可能會顯示不同的名稱或位置: 您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。 如需詳細資訊,請參閱將 IDE 個人化。
若要在對個別資料行值進行變更時加入驗證
在 [方案總管] 中按兩下 .xsd 檔案,在 建立和編輯具類型資料集中開啟資料集。 如需詳細資訊,請參閱如何:在 DataSet 設計工具中開啟資料集。
按兩下您要驗證的資料行。 這個動作會建立 ColumnChanging 事件處理常式。
注意
[DataSet 設計工具] 不會自動為這個 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。 輸入訂單時,驗證會確認訂單輸入時的 RequiredDate 不是在 OrderDate 當天或之前。 在本範例中,RequiredDate 和 OrderDate 資料行的值必須進行比較,所以驗證個別資料行變更並不合理。
在 建立和編輯具類型資料集上資料表的標題列中,按兩下資料表名稱,即可建立 RowChanging 事件的事件處理常式。
若要在整個資料列進行變更時加入驗證
在 [方案總管] 中按兩下 .xsd 檔案,在 建立和編輯具類型資料集中開啟資料集。 如需詳細資訊,請參閱如何:在 DataSet 設計工具中開啟資料集。
按兩下設計工具上資料表的標題列。
會建立一個具有
RowChanging
事件處理常式的部分類別,並在 [程式碼編輯器] 中開啟。注意
在 C# 專案中,[DataSet 設計工具] 不會自動為 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 = ""; } } }