Data for Silverlight
ビューの同期

マスター/詳細ビューはまだ同期されていません。下のグリッドには、上のグリッドで選択されているカテゴリには関係なく、すべての製品が表示されます。

ビューを同期するには、カテゴリグリッドで 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();
  }
}

このコードでも、マスタービューと詳細ビューを同期できます。前の方法では、同じビューに連結されている他のすべてのコントロールに影響しますが、この方法では、製品グリッドにのみ影響する点が異なります。

関連トピック

 

 


Copyright © GrapeCity inc. All rights reserved.