Share via


チュートリアル: データセットへの WPF コントロールのバインド

このチュートリアルでは、データ バインド コントロールを含む WPF アプリケーションを作成します。 コントロールは、データセットにカプセル化した製品レコードにバインドします。 また、製品間を参照するためのボタンの追加と、製品レコードへの変更の保存も行います。

このチュートリアルでは、次の作業について説明します。

  • WPF アプリケーションと、AdventureWorksLT サンプル データベースのデータから生成されるデータセットを作成する。

  • [データ ソース] ウィンドウから WPF デザイナー内のウィンドウにデータ テーブルをドラッグして、データ バインド コントロール セットを作成する。

  • 製品レコード間を前後に移動するためのボタンを作成する。

  • ユーザーが製品レコードに対して行った変更を、データ テーブルおよび基になるデータ ソースに保存するボタンを作成する。

    注意

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

必須コンポーネント

このチュートリアルを実行するには、次のコンポーネントが必要です。

  • Visual Studio 2010.

  • AdventureWorksLT サンプル データベースがアタッチされた、SQL Server または SQL Server Express の実行中のインスタンスへのアクセス。 AdventureWorksLT データベースは、CodePlex の Web サイトからダウンロードできます。

次の概念に関する予備知識があると役に立ちますが、チュートリアルを完了するうえで必須ではありません。

プロジェクトの作成

新しい WPF プロジェクトを作成します。 このプロジェクトでは、製品レコードを表示します。

プロジェクトを作成するには

  1. Visual Studio を起動します。

  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  3. [Visual Basic] または [Visual C#] を展開し、[Windows] を選択します。

  4. [WPF アプリケーション] プロジェクト テンプレートを選択します。

  5. [プロジェクト名] ボックスに「AdventureWorksProductsEditor」と入力し、[OK] をクリックします。

    Visual Studio によって、AdventureWorksProductsEditor プロジェクトが作成されます。

アプリケーションで使用するデータセットの作成

データ バインド コントロールを作成するには、アプリケーションで使用するデータ モデルを定義し、[データ ソース] ウィンドウに追加する必要があります。 このチュートリアルでは、データ モデルとして使用するデータセットを作成します。

データセットを作成するには

  1. [データ] メニューの [データ ソースの表示] をクリックします。

    [データ ソース] ウィンドウが開きます。

  2. [データ ソース] ウィンドウで、[新しいデータ ソースの追加] をクリックします。

    データ ソース構成ウィザードが開きます。

  3. [データソースの種類を選択] ページで、[データベース] を選択し、[次へ] をクリックします。

  4. [データベース モデルの選択] ページで、[データセット] を選択し、[次へ] をクリックします。

  5. [データ接続の選択] ページで、次のいずれかのオプションを選択します。

    • AdventureWorksLT サンプル データベースへのデータ接続がドロップダウン リストに表示されている場合は、それを選択し、[次へ] をクリックします。

      または

    • [新しい接続] をクリックし、AdventureWorksLT データベースへの接続を作成します。

  6. [接続文字列をアプリケーション構成ファイルに保存する] ページで、[次の名前で接続を保存する] チェック ボックスをオンにし、[次へ] をクリックします。

  7. [データベース オブジェクトの選択] ページで、[テーブル] を展開し、Product (SalesLT) テーブルを選択します。

  8. [完了] をクリックします。

    Visual Studio によって、プロジェクトに新しい AdventureWorksLTDataSet.xsd ファイルが追加されます。また、[データ ソース] ウィンドウに、対応する AdventureWorksLTDataSet 項目が追加されます。 AdventureWorksLTDataSet.xsd ファイルには、AdventureWorksLTDataSet という名前の型指定されたデータセットと、ProductTableAdapter という名前の TableAdapter が定義されます。 このチュートリアルの後半で、ProductTableAdapter を使用してデータセットにデータを読み込み、変更をデータベースに保存します。

  9. プロジェクトをビルドします。

TableAdapter の既定の Fill メソッドの編集

データセットにデータを読み込むには、ProductTableAdapter の Fill メソッドを使用します。 既定では、Fill メソッドによって、AdventureWorksLTDataSet の ProductDataTable に Product テーブルのすべてのデータ行が読み込まれます。 このメソッドは、行のサブセットのみを返すように変更できます。 このチュートリアルでは、写真付きの製品の行のみを返すように Fill メソッドを変更します。

写真付きの製品の行を読み込むには

  1. ソリューション エクスプローラーで、AdventureWorksLTDataSet.xsd ファイルをダブルクリックします。

    データセット デザイナーが開きます。

  2. デザイナーで、[Fill,GetData()] クエリを右クリックし、[構成] を選択します。

    TableAdapter 構成ウィザードが開きます。

  3. [SQL ステートメントの入力] ページのテキスト ボックスで、SELECT ステートメントの後ろに次の WHERE 句を追加します。

    WHERE ThumbnailPhotoFileName <> 'no_image_available_small.gif'
    
  4. [完了] をクリックします。

ユーザー インターフェイスの定義

WPF デザイナーで XAML を変更して、いくつかのボタンをウィンドウに追加します。 これらのボタンを使用して製品レコード間をスクロールしたり、製品レコードへの変更を保存したりできるようにするコードは、このチュートリアルで後で追加します。

ウィンドウのユーザー インターフェイスを定義するには

  1. ソリューション エクスプローラーで、MainWindow.xaml をダブルクリックします。

    WPF デザイナーで、ウィンドウが開きます。

  2. デザイナーの XAML ビューで、<Grid> タグの間に次のコードを追加します。

    <Grid.RowDefinitions>
        <RowDefinition Height="75" />
        <RowDefinition Height="625" />
    </Grid.RowDefinitions>
    <Button HorizontalAlignment="Left" Margin="22,20,0,24" Name="backButton" Width="75">&lt;</Button>
    <Button HorizontalAlignment="Left" Margin="116,20,0,24" Name="nextButton" Width="75">&gt;</Button>
    <Button HorizontalAlignment="Right" Margin="0,21,46,24" Name="saveButton" Width="110">Save changes</Button>
    
  3. プロジェクトをビルドします。

データ バインド コントロールの作成

顧客レコードを表示するコントロールを作成するには、[データ ソース] ウィンドウから WPF デザイナーに Product テーブルをドラッグします。

データ バインド コントロールを作成するには

  1. [データ ソース] ウィンドウで、[Product] ノードのドロップダウン メニューをクリックし、[詳細] を選択します。

  2. [Product] ノードを展開します。

  3. この例では、いくつかのフィールドを非表示にするために、次のノードの横にあるドロップダウン メニューをクリックし、[なし] を選択します。

    • ProductCategoryID

    • ProductModelID

    • ThumbnailPhotoFileName

    • rowguid

    • ModifiedDate

  4. [ThumbNailPhoto] ノードの横にあるドロップダウン メニューをクリックし、[イメージ] を選択します。

    注意

    既定では、画像を表す [データ ソース] ウィンドウ内の項目は、その既定のコントロールが [なし] に設定されています。 これは、画像がデータベース内でバイト配列として格納されているためです。バイト配列には、単純なバイト配列から大規模なアプリケーションの実行可能ファイルまで、任意のデータを格納することができます。

  5. [データ ソース] ウィンドウから、ボタンがある行の下のグリッド行に [Product] ノードをドラッグします。

    Visual Studio によって、Products テーブルのデータにバインドされるコントロール セットを定義する XAML が生成されます。 また、データを読み込むコードも生成されます。 生成される XAML とコードの詳細については、「Visual Studio でのデータへの WPF コントロールのバインド」を参照してください。

  6. デザイナーで、[Product ID] ラベルの横にあるテキスト ボックスをクリックします。

  7. [プロパティ] ウィンドウで、IsReadOnly プロパティの横にあるチェック ボックスをオンにします。

製品レコード間の移動

ユーザーが [<] ボタンと [>] ボタンを使用して、製品レコード間をスクロールできるようにするコードを追加します。

ユーザーが製品レコード間を移動できるようにするには

  1. デザイナーのウィンドウ領域で、[<] ボタンをダブルクリックします。

    Visual Studio で分離コード ファイルが開き、Click イベントに対する新しい backButton_Click イベント ハンドラーが作成されます。

  2. Window_Loaded イベント ハンドラーを変更して、ProductViewSource、AdventureWorksLTDataSet、および AdventureWorksLTDataSetProductTableAdapter がメソッドの外部で宣言され、フォーム全体からアクセスできるようにします。 次に示すように、これらはフォームに対してのみグローバルに宣言し、Window_Loaded イベント ハンドラー内で割り当てます。

    Dim ProductViewSource As System.Windows.Data.CollectionViewSource
    Dim AdventureWorksLTDataSet As AdventureWorksProductsEditor.AdventureWorksLTDataSet
    Dim AdventureWorksLTDataSetProductTableAdapter As AdventureWorksProductsEditor.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter
    
    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
        AdventureWorksLTDataSet = CType(Me.FindResource("AdventureWorksLTDataSet"), AdventureWorksProductsEditor.AdventureWorksLTDataSet)
        'Load data into the table Product. You can modify this code as needed.
        AdventureWorksLTDataSetProductTableAdapter = New AdventureWorksProductsEditor.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter()
        AdventureWorksLTDataSetProductTableAdapter.Fill(AdventureWorksLTDataSet.Product)
        ProductViewSource = CType(Me.FindResource("ProductViewSource"), System.Windows.Data.CollectionViewSource)
        ProductViewSource.View.MoveCurrentToFirst()
    End Sub
    
    private AdventureWorksProductsEditor.AdventureWorksLTDataSet AdventureWorksLTDataSet;
    private AdventureWorksProductsEditor.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter adventureWorksLTDataSetProductTableAdapter;
    private System.Windows.Data.CollectionViewSource productViewSource;
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        AdventureWorksLTDataSet = ((AdventureWorksProductsEditor.AdventureWorksLTDataSet)(this.FindResource("adventureWorksLTDataSet")));
        // Load data into the table Product. You can modify this code as needed.
        adventureWorksLTDataSetProductTableAdapter = new AdventureWorksProductsEditor.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter();
        adventureWorksLTDataSetProductTableAdapter.Fill(AdventureWorksLTDataSet.Product);
        productViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("productViewSource")));
        productViewSource.View.MoveCurrentToFirst();
    }
    
  3. backButton_Click イベント ハンドラーに次のコードを追加します。

    If ProductViewSource.View.CurrentPosition > 0 Then
        ProductViewSource.View.MoveCurrentToPrevious()
    End If
    
    if (productViewSource.View.CurrentPosition > 0)
    {
        productViewSource.View.MoveCurrentToPrevious();
    }
    
  4. デザイナーに戻り、[>] ボタンをダブルクリックします。

  5. nextButton_Click イベント ハンドラーに次のコードを追加します。

    If ProductViewSource.View.CurrentPosition < CType(ProductViewSource.View, CollectionView).Count - 1 Then
        ProductViewSource.View.MoveCurrentToNext()
    End If
    
    if (productViewSource.View.CurrentPosition < ((CollectionView)productViewSource.View).Count - 1)
    {
        productViewSource.View.MoveCurrentToNext();
    }
    

製品レコードへの変更の保存

ユーザーが [Save changes] ボタンを使用して、製品レコードへの変更を保存できるようにするコードを追加します。

製品レコードへの変更を保存する機能を追加するには

  1. デザイナーで、[Save changes] ボタンをダブルクリックします。

    Visual Studio で分離コード ファイルが開き、Click イベントの新しい saveButton_Click イベント ハンドラーが作成されます。

  2. saveButton_Click イベント ハンドラーに次のコードを追加します。

    AdventureWorksLTDataSetProductTableAdapter.Update(AdventureWorksLTDataSet.Product)
    
    adventureWorksLTDataSetProductTableAdapter.Update(AdventureWorksLTDataSet.Product);
    

    注意

    この例では、TableAdapter の Save メソッドを使用して変更を保存します。 このチュートリアルでは、データ テーブルは 1 つしか変更されないため、この方法が適しています。 複数のデータ テーブルへの変更を保存する必要がある場合は、Visual Studio によってデータセットと共に生成された TableAdapterManager の、UpdateAll メソッドを使用することもできます。 詳細については、「TableAdapterManager の概要」を参照してください。

アプリケーションのテスト

アプリケーションをビルドして実行します。 製品レコードを表示および更新できることを確認します。

アプリケーションをテストするには

  1. F5 キーを押します。

    アプリケーションがビルドされ、実行されます。 次の点を確認します。

    • テキスト ボックスに、写真付きの製品の先頭レコードのデータが表示されること。 この製品の製品 ID は 713 で、製品名は Long-Sleeve Logo Jersey, S です。

    • [>] ボタンまたは [<] ボタンをクリックして、他の製品レコードに移動できること。

  2. いずれかの製品レコードの [Size] の値を変更し、[Save changes] をクリックします。

  3. アプリケーションを終了し、Visual Studio で F5 キーを押してアプリケーションを再起動します。

  4. 変更した製品レコードに移動し、変更が保持されていることを確認します。

  5. アプリケーションを閉じます。

次の手順

このチュートリアルを完了したら、関連する次の作業を行うことができます。

参照

処理手順

方法: Visual Studio でデータに WPF コントロールをバインドする

チュートリアル: Entity Data Model への WPF コントロールのバインド

チュートリアル: WCF Data Service への WPF コントロールのバインド

概念

Visual Studio でのデータへの WPF コントロールのバインド

Visual Studio でのデータセットの操作

WPF および Silverlight デザイナーの概要

データ バインディングの概要