DataSource for Entity Framework for WinForms
大規模なデータセット:ページング
設計時の機能 > 大規模なデータセット:ページング

クライアントに大量のデータを一度に取り込むことなく表示するには、従来、ページングが使用されてきました。インタフェースが複雑になり、ユーザーにとってもあまり便利ではないため、ページングは理想的なソリューションと言えません。ただし、ページングの方が好ましいアプリケーションもあります。このような場合のために、C1DataSource はページングをサポートしています。しかも、これまでようにデータ変更が制限されることはありません。ユーザーは、1つのセッションで複数のページを変更できます。次のページに進む前に、前のページの変更をデータベースに送信する必要もありません。これは、Microsoft RIA サービスの DomainDataSource で実装されているようなページングよりはるかに優れています。

メモ:DataSource for Entity Framework には、ページングの欠点を補うソリューションが用意されています。これについては、このヘルプの「仮想モード」で説明します。

ページングを実装するには、次の手順に従います。

  1. マスター/詳細連結」の説明で作成したプロジェクトを使用します。前と同様に、同じ ContextType を使用して、C1DataSource コンポーネントを含む新しいフォームを追加します。このフォームをスタートアップフォームにすることで、プロジェクトの実行にかかる時間を短縮することができます。
  2. ViewSourceCollection エディタで ViewSource を作成します。EntitySetName には「Orders」と入力します。
  3. ここでは、ページングを有効にするために、PageSize プロパティを 10 に設定します。このプロパティには、妥当な値を任意に選択することができます。この値は、ページに表示されるデータ行の数を決定します。
  4. DataGrid をフォームに追加し、その C1DataSource プロパティを C1DataSource に、DataMember プロパティを Orders に設定します。
  5. ページ間を簡単に移動できるように、次の図のように btnPrevPagebtnNextPage の2つのボタン、およびラベル labelPage を追加します。

  6. 次のコードを追加します。PropertyChanged イベントの RefreshPageInfo ハンドラは、現在のページ番号とページ数を表示するために使用され、ボタンの Click イベントのハンドラは、次/前のページへの移動に使用されます。
    コードのコピー
    Imports C1.Data.DataSource
     Public Class Paging
         Private _view As ClientCollectionView
         Public Sub New()
             ' この呼び出しはデザイナで必要です。
             InitializeComponent()
             ' InitializeComponent() 呼び出しの後に初期化を追加します。
             _view = C1DataSource1("Orders")
             RefreshPageInfo()
             AddHandler _view.PropertyChanged, AddressOf RefreshPageInfo
         End Sub
         Private Sub RefreshPageInfo()
             labelPage.Text = String.Format("Page: {0} / {1}", _view.PageIndex + 1, _view.PageCount)
         End Sub
         Private Sub btnPrevPage_Click(sender As System.Object, e As System.EventArgs) Handles btnPrevPage.Click
             _view.MoveToPreviousPage()
         End Sub
         Private Sub btnNextPage_Click(sender As System.Object, e As System.EventArgs) Handles btnNextPage.Click
             _view.MoveToNextPage()
         End Sub
     End Class
    
    コードのコピー
    namespace TutorialsWinForms
     {
         public partial class Paging : Form
         {
             ClientCollectionView _view;
             public Paging()
             {
                 InitializeComponent();
                 _view = c1DataSource1["Orders"];
                 RefreshPageInfo();
                 _view.PropertyChanged += delegate { RefreshPageInfo(); };
             }
             private void RefreshPageInfo()
             {
                 labelPage.Text = string.Format("Page: {0} / {1}", _view.PageIndex + 1, _view.PageCount);
             }
             private void btnPrevPage_Click(object sender, EventArgs e)
             {
                 _view.MoveToPreviousPage();
             }
             private void btnNextPage_Click(object sender, EventArgs e)
             {
                 _view.MoveToNextPage();
             }
         }
     }
    
  7. アプリケーションを保存、ビルド、および実行します。Orders 間をページ移動します。ページ間を移動しながら、グリッドでいくつかのデータを変更してみます。1つのページでデータを変更してから別のページに移動し、そのページでもデータを変更します。C1DataSource では、変更したページをデータベースに保存しなくても、次のページに移動できることに注目してください。これは、Microsoft RIA サービスの DomainDataSource で実装されているようなページングより優れた重要な機能です。Microsoft RIA サービスの DomainDataSource で実装されているページングは Silverlight 用ですが、C1DataSource では、3つすべてのプラットフォーム(WinForms、WPF、Silverlight)で、他の機能と同様にこのページングの実装がサポートされています。

また、いくつかの注文を削除してみます。この操作も制限なく実行することができます。さらに、現在のページが自動的に更新されて、ページ内の行数が維持されます。新しい行を追加することもできます。新しい行は、データセットの最後に付加されます。

以前の同様に次のコードを使用して[変更の保存]ボタンを追加すると、そのボタンを使用して、複数のページに加えた変更を一度に保存することができます。

コードのコピー
Private Sub btnSaveChanges_Click(sender As System.Object, e As System.EventArgs)
  C1DataSource1.ClientCache.SaveChanges()
End Sub
コードのコピー
private voidbtnSaveChanges_Click(object sender, EventArgs e)
  {
     c1DataSource1.ClientCache.SaveChanges();
  }

これらの機能はすべて、データ変更に制限のないページングを実装するために求められるものです。ただし、この機能を実装することは簡単ではありません。たとえば、あるページで変更されたデータが他のページの表示に影響を与えるようなケースをすべて想定する必要があります。このため、ページングでは、データの変更が許可されていても、それに厳しい制限が課されることが普通です。たとえば、MS DomainDataSource では、他のページに移動する前に、すべての変更を保存する必要があります。C1DataSource がサポートしているページングでは、データを無制限に変更することができます。

他の多くの機能と同様に、変更に制限のないページングは、クライアント側のキャッシュによって実現されています(「クライアントデータキャッシュの能力」を参照)。つまり、C1DataSource に実装されているページングは、パフォーマンスとメモリ消費の両面で最適化されています。この最適化は、キャッシュによって実現されています。最近開いたページがメモリに保存されるので、通常は、同じページを再度開くと瞬時に表示されます。また、メモリリソースが管理され(古いページは必要に応じて解放されます)、メモリリークが防止されます。