CodeZine(コードジン)

特集ページ一覧

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

NetAdvantage Silverlight LOB 機能解説

  • LINEで送る
  • このエントリーをはてなブックマークに追加
目次

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のページング処理をロードオンデマンドで行う実行画面

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

あなたにオススメ

著者プロフィール

バックナンバー

連載:Infragistics NetAdvantageチュートリアル

もっと読む

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5