「大規模なデータセット:ページング|document=WordDocuments\C1DataStudio-WPF.docx;topic=Large Datasets\: Paging」で説明したように、Entity Framework DataSource(EF DataSource)には、大規模なデータや大量の行を処理するためのソリューションとして、ページングよりはるかに優れた機能があります。
数千から数百万もの行を持つ大規模なデータセットを問題なく使用できるとしたらどうでしょうか。ページングを使用せず、コードを変更することもなく、1つのブール値プロパティを設定するだけで、データセットが小規模な場合と同じコントロールを使用して巨大なデータセットを表示できるとしたらどうでしょうか。EF DataSource は、魔法のような VirtualMode プロパティによってこれを実現します。
仮想モードを実装するには、次の手順に従います。
ItemsSource="{Binding ElementName=c1DataSource1, Path=Order_Details}"
Managed オプションを選択したので、データを操作するグリッドコントロールを指定する必要があります。EF DataSource は、添付プロパティ C1DataSource.ControlHandler|tag=P_C1_WPF_Data_Entities_C1DataSource_ControlHandler を定義します。これは、C1DataSource|keyword=C1DataSource クラス に連結されるとコントロールの動作に影響を及ぼすプロパティを持つオブジェクトです。C1DataSource.ControlHandler|tag=P_C1_WPF_Data_Entities_C1DataSource_ControlHandler には、VirtualMode ブール値プロパティがあります。このプロパティは、このコントロールを Managed 仮想モードのメインの "制御中" コントロールとしてマークします。
XAML |
コードのコピー
|
---|---|
<DataGrid AutoGenerateColumns="True" Name="dataGrid1" ItemsSource="{Binding ElementName=c1DataSource1, Path=Order_Details}"> <c1:C1DataSource.ControHandler> <c1:ControlHandler VirtualMode="True"/> </c1:C1DataSource.ControHandler> </DataGrid> |
これほど優れたグリッドはほかにありません。このグリッドで、適切に移動およびスクロールしたり、行データを変更することができます。外観も動作も従来のデータグリッドと同様で、それがまさに重要な点です。難点の多いページングもコードの記述もまったくなく、大規模なデータセットを使用できるようになりました。さらに、DataSource プロパティを持つ任意の GUI コントロールを使用できるという利点があります。この例では、比較的小さなサイズのデータセットを使用しましたが、仮想モードで実行される C1DataSource は、はるかに大きなデータセットでも同様に応答します。その動作が行数に左右されることはありません。その点について確認するために、製品と共にインストールされている OrdersDemo サンプルを見てみます。このサンプルでは、より大きなデータベースが使用されており、その行数は、この例で使用されているデータセットより約 65,000 行多くなっています。ただし、応答速度はどちらも変わりません。このように、C1DataSource の動作は、データセットの行数に左右されません。
なぜ、このようなことが可能なのでしょうか。その動作はページングとかなり似ていますが、内部的な動作は GUI コントロールからは見えず、隠れて行われているページングと言えます。GUI コントロールには、データがクライアントにフェッチされ、使用する準備ができているかのように示されます。GUI コントロールがデータを要求すると、C1DataSource または ClientViewSource(C1DataSource コントロールがなく、コードで ClientViewSource が使用されている場合)は、メモリから、つまりすべての機能に使用されているクライアント側のキャッシュから、データを取得して提供できるかどうかを最初に確認します。メモリにデータが見つからない場合は、要求されたデータをサーバーから透過的にフェッチします。クライアント側のキャッシュを使用する他の機能と同様に、C1DataSource は、フェッチしたデータを無制限には保存しません。無制限に保存すると、メモリリークになってしまいます。C1DataSource は、GUI コントロールに提供する必要があるデータを認識しています。変更されたり、変更された部分に関係するために、保存しておく必要があるデータも認識しています。また、不要になった古いデータを必要に応じて解放します。コードを記述する必要はなく、任意の GUI コントロールを使用できます。