次の方法で共有


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

更新 : 2007 年 11 月

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

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

Bb531223.alert_note(ja-jp,VS.90).gifメモ :

"DataSet プロジェクト" プロパティを設定してデータセットを TableAdapter から分離する場合でも、プロジェクト内の既存のデータセット部分クラスは自動的には移動されません。既存のデータセット部分クラスは、手動でデータセット プロジェクトに移動する必要があります。

Bb531223.alert_note(ja-jp,VS.90).gifメモ :

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
Bb531223.alert_note(ja-jp,VS.90).gifメモ :

C# プロジェクトでは、データセットの部分クラスとデータセットの個々のテーブルのみがデータセット デザイナにより作成されます。C# では、Visual Basic と同様に ColumnChanging イベントおよび RowChanging イベントのイベント ハンドラはデータセット デザイナにより自動作成されません。C# プロジェクトでは、イベントを処理するメソッドを手動で作成し、基になるイベントにメソッドをフックする必要があります。次の手順では、必要なイベント ハンドラを Visual Basic と C# の両方で作成する方法について説明します。

Bb531223.alert_note(ja-jp,VS.90).gifメモ :

お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。

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

  1. ソリューション エクスプローラで .xsd ファイルをダブルクリックして、データセット デザイナでデータセットを開きます。詳細については、「方法 : データセット デザイナでデータセットを開く」を参照してください。

  2. 検証する列をダブルクリックします。この操作によって ColumnChanging イベント ハンドラが作成されます。

    Bb531223.alert_note(ja-jp,VS.90).gifメモ :

    データセット デザイナでは、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 イベント ハンドラを使用して部分クラスが作成され、コード エディタが開きます。

    Bb531223.alert_note(ja-jp,VS.90).gifメモ :

    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 を使用したデータ アプリケーションの作成

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

データの妥当性検査の概要