.NET Framework アプリケーションのデータセットに WPF コントロールをバインドする

Note

データセットと関連クラスは、アプリケーションがデータベースから切断されている間にアプリケーションがメモリ内のデータを操作できるようにする、2000 年代初期からのレガシ .NET Framework テクノロジです。 テクノロジが特に役立つのは、ユーザーがデータを変更し、変更をデータベースに戻して保持できるようにするアプリケーションです。 データセットは非常に優れたテクノロジであることが証明されていますが、新しい .NET アプリケーションでは Entity Framework Core を使用することをお勧めしています。 Entity Framework には、オブジェクト モデルとして表形式データを操作する、より自然な方法が用意されており、よりシンプルなプログラミング インターフェイスが備わっています。

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

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

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

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

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

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

Note

この記事で紹介する Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 Visual Studio のエディションや環境設定がお使いのものと異なる場合があります。 詳細については、「Visual Studio IDE のカスタマイズ」を参照してください。

必須コンポーネント

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

  • このチュートリアルを完了するには、Visual Studio にインストールされている .NET デスクトップ開発データの保存と処理のワークロードが必要です。 これらをインストールするには、Visual Studio インストーラーを開き、変更する Visual Studio のバージョンの横にある [変更] (または [その他]>[変更] ) を選択します。 Visual Studio の変更に関するページを参照してください。

  • AdventureWorks Light (AdventureWorksLT) サンプル データベースがアタッチされた、SQL Server または SQL Server Express の実行中のインスタンスへのアクセス権。 データベースをダウンロードするには、AdventureWorks サンプル データベースを参照してください。

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

プロジェクトを作成する

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

  1. Visual Studio を開きます。

  2. スタート ウィンドウで、 [新しいプロジェクトの作成] を選択します。

  3. C# の [WPF アプリケーション] プロジェクト テンプレートを検索し、手順に従ってプロジェクトを作成し、プロジェクトに AdventureWorksProductsEditor という名前を付けます。

    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 メソッドを編集する

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

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

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

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

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

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

    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] ノードの横にあるドロップダウン リストリスト メニューをクリックし、[イメージ] を選択します。

    Note

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

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

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

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

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

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

  1. デザイナーで、ウィンドウ サーフェイスの [<] をダブルクリックします。

    Visual Studio によって分離コード ファイルが開かれ、backButton_Click イベントのために新しい Click イベント ハンドラーが作成されます。

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

    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)
    {
        productViewSource.View.MoveCurrentToPrevious();
    }
    
  4. デザイナーに戻り、 [>] をダブルクリックします。

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

    if (productViewSource.View.CurrentPosition < ((CollectionView)productViewSource.View).Count - 1)
    {
        productViewSource.View.MoveCurrentToNext();
    }
    

製品レコードに変更を保存する

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

  1. デザイナーで、[変更の保存] をダブルクリックします。

    Visual Studio によって分離コード ファイルが開かれ、saveButton_Click イベントのために新しい Click イベント ハンドラーが作成されます。

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

    adventureWorksLTDataSetProductTableAdapter.Update(AdventureWorksLTDataSet.Product);
    

    注意

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

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

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

  1. F5キーを押します。

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

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

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

  2. いずれかの製品レコードで [サイズ] の値を変更し、[変更の保存] を選択します。

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

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

  5. アプリケーションを終了します。

次のステップ

このチュートリアルを完了した後、関連する次のタスクを試してみることができます。

  • Visual Studio の [データ ソース] ウィンドウを使用して、WPF コントロールをその他の種類のデータ ソースにバインドする方法について学習します。 詳細については、「WCF Data Service への WPF コントロールのバインド」を参照してください。

  • Visual Studio の [データ ソース] ウィンドウを使用して、WPF コントロールでの関連するデータ (つまり、親子関係にあるデータ) を表示する方法について学習します。 詳細については、チュートリアル「WPF アプリケーションで関連データを表示する」を参照してください。