SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Infragistics NetAdvantageチュートリアル(AD)

VirtualCollectionフレームワークを使ったロードオンデマンド処理の実装

NetAdvantage Silverlight LOB 機能解説

  • このエントリーをはてなブックマークに追加

VirtualCollection によるロードオンデマンド

 VirtualCollectionは、一般的なロードオンデマンドのシナリオを簡単に実現するために用意されたフレームワークで、NetAdvantage Silverlight LOBに含まれています。

 標準のDataGridやxamWebGrid などのデータグリッドコントロールに大量のデータを読み込むときに、このVirtualCollectionをバインドすることによってデータソースを間接的にコントロールし、部分的なデータロードやデータのキャッシングを行えるようにします。

 通常、データグリッドコントロールに情報を表示するときは、ItemsSourceプロパティに何らかのコレクションやリストのオブジェクトをバインドしますが、ロードオンデマンドが必要なシナリオではVirtualCollectionオブジェクトをItemsSourceプロパティにバインドします。

 データグリッドに最初にデータを表示するときや、スクロール処理やページングによって追加のデータ表示が必要になったとき、VirtualCollectionのItemDataRequestedイベントが発生するので、このタイミングで必要なデータをデータソースに対して要求し、取得したデータをVirtualCollectionに追加することができます。取得したデータはVirtualCollectionの内部でキャッシュされるため、重複する不要なデータについてのリクエストを抑制することができます。また、VirtualCollectionの初期化時に想定される最大件数を設定できるため、トータル行数に対して適切な縦スクロールバーの幅やページングにおけるページ数をユーザーに提供することができます。

VirtualCollection を使って
DataGridのページング処理をロードオンデマンド化する

 それでは実例を挙げて使い方を見ていきましょう。標準のDataGridを使い、ページング機能と組み合わせたロードオンデマンドの実装を例にとります。

 最初に、Silverlightプロジェクトに必要な参照設定を追加します。VirtualCollection機能を使う場合、Infragistics.SilverlightとInfragistics.Silverlight.VirtualCollectionの2つのアセンブリーが必要となります。

 次に、テスト用の画面を構成します。次のようにSilverlight標準のDataGridとDataPagerを配置したXAMLを作成します。

DataGridPagingクラスのXAMLコード
DataGridPagingクラスのXAMLコード

 続いて必要なコードビハインドを処理の流れに沿って説明します。まずはクラス定義とコンストラクタ、ロード処理といった初期処理の部分を見てみましょう。ここではVirtualCollection<TestData>のインスタンスをフィールドとして保持し、UserControl.Loadedのタイミングでサービスの初期化を行っています。

DataGridPagingクラスのコードビハインド(コンストラクタとロードイベント)
DataGridPagingクラスのコードビハインド(コンストラクタとロードイベント)

 ここで使用するサービスクラスの手続きについても確認しておきます。通常、データ取得用のサービスはWCFサービスなどWebサーバ側に配置することがほとんどですが、今回のサンプルでは以下のpublicメンバーを持ったTestServiceというサービスのモックアップクラスをクライアント側でホストしています(ただし実際のサービス アクセスの方式と同様に、非同期モデルのメンバー構成としています)。

サービスクラスTestServiceのpublicメンバー
サービスクラスTestServiceのpublicメンバー

 クライアント側のInitializeServiceメソッドでは、TestDataServiceの初期化処理とイベント設定をしています。ここで初回のサービス問い合わせとしてGetTotalRowCountAsyncを呼び出し、取得対象となるデータの総件数を取得します。

InitializeServiceメソッドとデータ件数取得完了時処理
InitializeServiceメソッドとデータ件数取得完了時処理

 以下のInitVirtualCollectionメソッドでは、取得したデータ件数をもとにVirtualCollectionを初期化し、1回のデータロードのサイズやページングサイズを指定しています。さらに、DataGrid と DataPagerのItemsSourceにVirtualCollectionをセットします。VirtualCollectionが取り扱う最大データ数についてはコンストラクタで指定する以外にも、VirtualCollection.AnticipatedCount プロパティで指定することも可能です。

InitVirtualCollectionメソッド
InitVirtualCollectionメソッド

 DataGridのItemsSourceにVirtualCollectionを設定したことで、以後DataGrid上にデータを表示する必要が生じたとき、自動的にItemDataRequestedイベントが起動されます。最初は「1ページ」分のデータが要求され、その後はページを切り替える度に対象ページのデータ取得が要求されます。

ItemDataRequestedイベント ハンドラー
ItemDataRequestedイベント ハンドラー

 サービスからのデータ取得完了イベントをハンドルする以下の処理の中で、VirtualCollection.LoadItemsメソッドを呼び出してデータの追加を行います。ここではじめてVirtualCollection内の指定インデックス位置にデータが設定され、画面に表示が行われます。

サービスからのデータ取得完了イベントハンドラー
サービスからのデータ取得完了イベントハンドラー

 以上でページングを行うDataGridに対するロードオンデマンド実装が一通り終わりました。以下のイメージはその動作スクリーンショットですが、DataPagerでページングを行ったタイミングで追加のデータリクエストが発生している様子が確認できると思います。また既に取得済みのページを再度選択した場合には、VirtualCollectionの中のキャッシュデータを参照するために、追加のリクエストが発生しません。

DataGridのページング処理をロードオンデマンドで行う実行画面
DataGridのページング処理をロードオンデマンドで行う実行画面

次のページ
VirtualCollectionを使って DataGridのスクロール処理をロードオンデマンド化する

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Infragistics NetAdvantageチュートリアル連載記事一覧

もっと読む

この記事の著者

インフラジスティックス・ジャパン株式会社 山田 達也(インフラジスティックス・ジャパンカブシキガイシャ ヤマダ タツヤ)

国内ソフトベンダーにて多数の.NETプロジェクトに携わる。現在はインフラジスティックス・ジャパンで開発サポートを担当しつつ、リッチクライアントやRIA技術を広めるべくエバンジェリスト修行中。趣味は全国競馬場巡りで夢はラスベガス在住。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5280 2010/06/25 18:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング