チュートリアル > クライアント側の実装 > ビューの同期 |
マスター/詳細ビューはまだ同期されていません。下のグリッドには、上のグリッドで選択されているカテゴリには関係なく、すべての製品が表示されます。
ビューを同期するには、カテゴリグリッドで SelectionChanged イベントを処理し、選択されたカテゴリに属する製品のみが表示されるように製品をフィルタする必要があります。
同期するには、最初に、Page コンストラクタにイベントハンドラを追加します。
コードのコピー
|
|
---|---|
public Page()
{
InitializeComponent();
LoadData();
_gridCategories.SelectionChanged += _gridCategories_SelectionChanged;
}
|
このイベントハンドラは次のように実装されます。
コードのコピー
|
|
---|---|
void _gridCategories_SelectionChanged(object sender, EventArgs e) { var drv = _gridCategories.SelectedItem as DataRowView; if (drv != null) { var dv = _ds.Tables["Products"].DefaultView; dv.RowFilter = string.Format("CategoryID = {0}", drv.GetData("CategoryID")); } } |
このコードは、選択されたカテゴリを DataRowView オブジェクトとして取得し、"Products" テーブル(2つめのグリッドのデータソースとして使用)のデフォルトビューを取得し、フィルタを適用します。このコードも、Windows フォームや ASP.NET の開発者にはおなじみです。
再度、アプリケーションを実行すると、ビューが同期されていることを確認できます。
DataView にフィルタを適用する代わりに、LINQ クエリーを使って Products テーブルを更新することもできます。次に例を挙げます。
コードのコピー
|
|
---|---|
void _gridCategories_SelectionChanged(object sender, EventArgs e) { var drv = _gridCategories.SelectedItem as DataRowView; if (drv != null) { int id = (int)drv.GetData("CategoryID"); _gridProducts.ItemsSource = from dr in _ds.Tables["Products"].Rows where (int)dr["CategoryID"] == id select dr.GetRowView(); } } |
このコードでも、マスタービューと詳細ビューを同期できます。前の方法では、同じビューに連結されている他のすべてのコントロールに影響しますが、この方法では、製品グリッドにのみ影響する点が異なります。