方法 : n 層データセットに検証を追加する

n 層ソリューションに分離されたデータセットへの検証の追加は、単一ファイルのデータセット (1 つのプロジェクト内のデータセット) に検証を追加するのと基本的には同じです。 データで検証を実行する位置として推奨されるのは、データ テーブルの ColumnChanging イベントや RowChanging イベントの発生時です。

型指定されたデータセットの作成と編集には、データセットのデータ テーブルの列および行変更イベントにユーザー コードを追加できる部分クラスを作成する機能があります。 n 層ソリューションのデータセットにコードを追加する方法の詳細については、「方法 : n 層アプリケーションのデータセットにコードを追加する」および「方法 : n 層アプリケーションの TableAdapters にコードを追加する」を参照してください。 部分クラスの詳細については、「方法: 1 つのクラスを複数の部分クラスに分割する (クラス デザイナー)」または「部分クラスと部分メソッド (C# プログラミング ガイド)」を参照してください。

注意

"DataSet プロジェクト" プロパティを設定してデータセットを 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 での開発設定のカスタマイズ」を参照してください。

個々の列値の変更時に検証を追加するには

  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 について考えます。 注文が入力されると、RequiredDate が 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 層データ アプリケーションの作成

概念

n 層データ アプリケーションの概要

データセットのデータの検証