チュートリアル: データセットへの WPF コントロールのバインド
このチュートリアルでは、データ バインド コントロールを含む WPF アプリケーションを作成します。 コントロールは、データセットにカプセル化した製品レコードにバインドします。 また、製品間を参照するためのボタンの追加と、製品レコードへの変更の保存も行います。
このチュートリアルでは、次の作業について説明します。
WPF アプリケーションと、AdventureWorksLT サンプル データベースのデータから生成されるデータセットを作成する。
[データ ソース] ウィンドウから WPF デザイナー内のウィンドウにデータ テーブルをドラッグして、データ バインド コントロール セットを作成する。
製品レコード間を前後に移動するためのボタンを作成する。
ユーザーが製品レコードに対して行った変更を、データ テーブルおよび基になるデータ ソースに保存するボタンを作成する。
注意
次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用する Visual Studio のエディションとその設定によって決まります。 詳細については、「設定の操作」を参照してください。
必須コンポーネント
このチュートリアルを実行するには、次のコンポーネントが必要です。
Visual Studio 2010.
AdventureWorksLT サンプル データベースがアタッチされた、SQL Server または SQL Server Express の実行中のインスタンスへのアクセス。 AdventureWorksLT データベースは、CodePlex の Web サイトからダウンロードできます。
次の概念に関する予備知識があると役に立ちますが、チュートリアルを完了するうえで必須ではありません。
データセットおよび TableAdapters。 詳細については、「Visual Studio でのデータセットの操作」および「TableAdapter の概要」を参照してください。
WPF デザイナーの操作。 詳細については、「WPF および Silverlight デザイナーの概要」を参照してください。
WPF のデータ バインディング。 詳細については、「データ バインディングの概要」を参照してください。
プロジェクトの作成
新しい WPF プロジェクトを作成します。 このプロジェクトでは、製品レコードを表示します。
プロジェクトを作成するには
Visual Studio を起動します。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[Visual Basic] または [Visual C#] を展開し、[Windows] を選択します。
[WPF アプリケーション] プロジェクト テンプレートを選択します。
[プロジェクト名] ボックスに「AdventureWorksProductsEditor」と入力し、[OK] をクリックします。
Visual Studio によって、AdventureWorksProductsEditor プロジェクトが作成されます。
アプリケーションで使用するデータセットの作成
データ バインド コントロールを作成するには、アプリケーションで使用するデータ モデルを定義し、[データ ソース] ウィンドウに追加する必要があります。 このチュートリアルでは、データ モデルとして使用するデータセットを作成します。
データセットを作成するには
[データ] メニューの [データ ソースの表示] をクリックします。
[データ ソース] ウィンドウが開きます。
[データ ソース] ウィンドウで、[新しいデータ ソースの追加] をクリックします。
データ ソース構成ウィザードが開きます。
[データソースの種類を選択] ページで、[データベース] を選択し、[次へ] をクリックします。
[データベース モデルの選択] ページで、[データセット] を選択し、[次へ] をクリックします。
[データ接続の選択] ページで、次のいずれかのオプションを選択します。
AdventureWorksLT サンプル データベースへのデータ接続がドロップダウン リストに表示されている場合は、それを選択し、[次へ] をクリックします。
または
[新しい接続] をクリックし、AdventureWorksLT データベースへの接続を作成します。
[接続文字列をアプリケーション構成ファイルに保存する] ページで、[次の名前で接続を保存する] チェック ボックスをオンにし、[次へ] をクリックします。
[データベース オブジェクトの選択] ページで、[テーブル] を展開し、Product (SalesLT) テーブルを選択します。
[完了] をクリックします。
Visual Studio によって、プロジェクトに新しい AdventureWorksLTDataSet.xsd ファイルが追加されます。また、[データ ソース] ウィンドウに、対応する AdventureWorksLTDataSet 項目が追加されます。 AdventureWorksLTDataSet.xsd ファイルには、AdventureWorksLTDataSet という名前の型指定されたデータセットと、ProductTableAdapter という名前の TableAdapter が定義されます。 このチュートリアルの後半で、ProductTableAdapter を使用してデータセットにデータを読み込み、変更をデータベースに保存します。
プロジェクトをビルドします。
TableAdapter の既定の Fill メソッドの編集
データセットにデータを読み込むには、ProductTableAdapter の Fill メソッドを使用します。 既定では、Fill メソッドによって、AdventureWorksLTDataSet の ProductDataTable に Product テーブルのすべてのデータ行が読み込まれます。 このメソッドは、行のサブセットのみを返すように変更できます。 このチュートリアルでは、写真付きの製品の行のみを返すように Fill メソッドを変更します。
写真付きの製品の行を読み込むには
ソリューション エクスプローラーで、AdventureWorksLTDataSet.xsd ファイルをダブルクリックします。
データセット デザイナーが開きます。
デザイナーで、[Fill,GetData()] クエリを右クリックし、[構成] を選択します。
TableAdapter 構成ウィザードが開きます。
[SQL ステートメントの入力] ページのテキスト ボックスで、SELECT ステートメントの後ろに次の WHERE 句を追加します。
WHERE ThumbnailPhotoFileName <> 'no_image_available_small.gif'
[完了] をクリックします。
ユーザー インターフェイスの定義
WPF デザイナーで XAML を変更して、いくつかのボタンをウィンドウに追加します。 これらのボタンを使用して製品レコード間をスクロールしたり、製品レコードへの変更を保存したりできるようにするコードは、このチュートリアルで後で追加します。
ウィンドウのユーザー インターフェイスを定義するには
ソリューション エクスプローラーで、MainWindow.xaml をダブルクリックします。
WPF デザイナーで、ウィンドウが開きます。
デザイナーの XAML ビューで、<Grid> タグの間に次のコードを追加します。
<Grid.RowDefinitions> <RowDefinition Height="75" /> <RowDefinition Height="625" /> </Grid.RowDefinitions> <Button HorizontalAlignment="Left" Margin="22,20,0,24" Name="backButton" Width="75"><</Button> <Button HorizontalAlignment="Left" Margin="116,20,0,24" Name="nextButton" Width="75">></Button> <Button HorizontalAlignment="Right" Margin="0,21,46,24" Name="saveButton" Width="110">Save changes</Button>
プロジェクトをビルドします。
データ バインド コントロールの作成
顧客レコードを表示するコントロールを作成するには、[データ ソース] ウィンドウから WPF デザイナーに Product テーブルをドラッグします。
データ バインド コントロールを作成するには
[データ ソース] ウィンドウで、[Product] ノードのドロップダウン メニューをクリックし、[詳細] を選択します。
[Product] ノードを展開します。
この例では、いくつかのフィールドを非表示にするために、次のノードの横にあるドロップダウン メニューをクリックし、[なし] を選択します。
ProductCategoryID
ProductModelID
ThumbnailPhotoFileName
rowguid
ModifiedDate
[ThumbNailPhoto] ノードの横にあるドロップダウン メニューをクリックし、[イメージ] を選択します。
注意
既定では、画像を表す [データ ソース] ウィンドウ内の項目は、その既定のコントロールが [なし] に設定されています。 これは、画像がデータベース内でバイト配列として格納されているためです。バイト配列には、単純なバイト配列から大規模なアプリケーションの実行可能ファイルまで、任意のデータを格納することができます。
[データ ソース] ウィンドウから、ボタンがある行の下のグリッド行に [Product] ノードをドラッグします。
Visual Studio によって、Products テーブルのデータにバインドされるコントロール セットを定義する XAML が生成されます。 また、データを読み込むコードも生成されます。 生成される XAML とコードの詳細については、「Visual Studio でのデータへの WPF コントロールのバインド」を参照してください。
デザイナーで、[Product ID] ラベルの横にあるテキスト ボックスをクリックします。
[プロパティ] ウィンドウで、IsReadOnly プロパティの横にあるチェック ボックスをオンにします。
製品レコード間の移動
ユーザーが [<] ボタンと [>] ボタンを使用して、製品レコード間をスクロールできるようにするコードを追加します。
ユーザーが製品レコード間を移動できるようにするには
デザイナーのウィンドウ領域で、[<] ボタンをダブルクリックします。
Visual Studio で分離コード ファイルが開き、Click イベントに対する新しい backButton_Click イベント ハンドラーが作成されます。
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(); }
backButton_Click イベント ハンドラーに次のコードを追加します。
If ProductViewSource.View.CurrentPosition > 0 Then ProductViewSource.View.MoveCurrentToPrevious() End If
if (productViewSource.View.CurrentPosition > 0) { productViewSource.View.MoveCurrentToPrevious(); }
デザイナーに戻り、[>] ボタンをダブルクリックします。
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] ボタンを使用して、製品レコードへの変更を保存できるようにするコードを追加します。
製品レコードへの変更を保存する機能を追加するには
デザイナーで、[Save changes] ボタンをダブルクリックします。
Visual Studio で分離コード ファイルが開き、Click イベントの新しい saveButton_Click イベント ハンドラーが作成されます。
saveButton_Click イベント ハンドラーに次のコードを追加します。
AdventureWorksLTDataSetProductTableAdapter.Update(AdventureWorksLTDataSet.Product)
adventureWorksLTDataSetProductTableAdapter.Update(AdventureWorksLTDataSet.Product);
注意
この例では、TableAdapter の Save メソッドを使用して変更を保存します。 このチュートリアルでは、データ テーブルは 1 つしか変更されないため、この方法が適しています。 複数のデータ テーブルへの変更を保存する必要がある場合は、Visual Studio によってデータセットと共に生成された TableAdapterManager の、UpdateAll メソッドを使用することもできます。 詳細については、「TableAdapterManager の概要」を参照してください。
アプリケーションのテスト
アプリケーションをビルドして実行します。 製品レコードを表示および更新できることを確認します。
アプリケーションをテストするには
F5 キーを押します。
アプリケーションがビルドされ、実行されます。 次の点を確認します。
テキスト ボックスに、写真付きの製品の先頭レコードのデータが表示されること。 この製品の製品 ID は 713 で、製品名は Long-Sleeve Logo Jersey, S です。
[>] ボタンまたは [<] ボタンをクリックして、他の製品レコードに移動できること。
いずれかの製品レコードの [Size] の値を変更し、[Save changes] をクリックします。
アプリケーションを終了し、Visual Studio で F5 キーを押してアプリケーションを再起動します。
変更した製品レコードに移動し、変更が保持されていることを確認します。
アプリケーションを閉じます。
次の手順
このチュートリアルを完了したら、関連する次の作業を行うことができます。
Visual Studio で [データ ソース] ウィンドウを使用して、WPF コントロールを他の種類のデータ ソースにバインドする方法を学習する。 詳細については、「チュートリアル: WCF Data Service への WPF コントロールのバインド」および「チュートリアル: Entity Data Model への WPF コントロールのバインド」を参照してください。
Visual Studio で [データ ソース] ウィンドウを使用して、関連するデータ (つまり、親子のリレーションシップを持つデータ) を WPF コントロールで表示する方法を学習する。 詳細については、「チュートリアル: WPF アプリケーションでの関連データの表示」を参照してください。
参照
処理手順
方法: Visual Studio でデータに WPF コントロールをバインドする
チュートリアル: Entity Data Model への WPF コントロールのバインド
チュートリアル: WCF Data Service への WPF コントロールのバインド