方法 : n 層データセットに検証を追加する
更新 : 2007 年 11 月
n 層ソリューションに分離されたデータセットへの検証の追加は、単一ファイルのデータセット (1 つのプロジェクト内のデータセット) に検証を追加するのと基本的には同じです。データで検証を実行する位置として推奨されるのは、データ テーブルの ColumnChanging イベントや RowChanging イベントの発生時です。
データセット デザイナには、データセットのデータ テーブルの列および行変更イベントにユーザー コードを追加できる部分クラスを作成する機能があります。n 層ソリューションのデータセットにコードを追加する方法の詳細については、「方法 : n 層アプリケーションのデータセットにコードを追加する」および「方法 : n 層アプリケーションの TableAdapters にコードを追加する」を参照してください。部分クラスの詳細については、「方法 : 1 つのクラスを複数の部分クラスに分割する」または「部分クラスと部分メソッド (C# プログラミング ガイド)」を参照してください。
メモ : |
---|
"DataSet プロジェクト" プロパティを設定してデータセットを TableAdapter から分離する場合でも、プロジェクト内の既存のデータセット部分クラスは自動的には移動されません。既存のデータセット部分クラスは、手動でデータセット プロジェクトに移動する必要があります。 |
メモ : |
---|
C# では、ColumnChanging イベントおよび RowChanging イベントのイベント ハンドラはデータセット デザイナにより自動作成されません。イベント ハンドラを手動で作成し、基になるイベントにイベント ハンドラをフックする必要があります。次の手順では、Visual Basic と C# の両方で必要なイベント ハンドラを作成する方法について説明します。 |
個々の列の変更の検証
個々の列の値は、ColumnChanging イベントを処理することにより検証します。ColumnChanging イベントは、列の値が変更されたときに発生します。データセット デザイナの目的の列をダブルクリックすることにより、ColumnChanging イベントのイベント ハンドラを作成します。
最初に列をダブルクリックすると、デザイナにより ColumnChanging イベントのイベント ハンドラが生成されます。ColumnChanging イベントに加えて、特定の列をテストする If?cThen ステートメントも作成されます。たとえば、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 について考えます。注文が入力されると、RequiredDate が 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 = ""; } } }