DataSource for Entity Framework for WPF/Silverlight
大規模なデータセット:ページング
DataSource for Entity Framework > 大規模なデータセット:ページング

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

メモ: EF DataSource には、ページングの欠点を補うソリューションが用意されています。これについては、このマニュアルの「仮想モード|document=WordDocuments\C1DataStudio-WPF.docx;topic=Large Datasets\: Virtual Mode」で説明します。

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

マスター/詳細連結|document=WordDocuments\C1DataStudio-WPF.docx;topic=Master-Detail Binding」の説明で作成したプロジェクトを使用します。前と同様に、同じ ObjectContextType を使用して、C1DataSource コンポーネントを含む新しいフォームを追加します。このフォームをスタートアップフォームにすることで、プロジェクトの実行にかかる時間を短縮することができます。

  1. ViewSourceCollection エディタで ViewSource を作成します。EntitySetName には「Orders」と入力します。
  2. ここでは、ページングを有効にするために、PageSize プロパティを 10 に設定します。このプロパティには、妥当な値を任意に選択することができます。この値は、ページに表示されるデータ行の数を決定します。
  3. 次に、フォームにグリッドを追加し、前と同じ方法でそれを Orders に連結します。

ItemsSource="{Binding ElementName=c1DataSource1, Path=Orders}"

  1. XAML でグリッドの AutoGenerateColumns プロパティを True に設定します。
  2. ユーザーがページ間を移動できるようにし、現在のページとページ数を表示するには、さらにいくつかのコントロールを追加する必要があります。たとえば、次の XAML を使用して、2つのボタンと1つのラベルを追加します。
    XAML
    コードのコピー
    <StackPanel Orientation="Horizontal" Grid.Row="1" Margin="2">
        <Button Padding="10,0,10,0" Margin="1" Content="&lt;" Click="MoveToPrevPage"/>
        <TextBlock VerticalAlignment="Center" Text="Page: "/>
        <TextBlock VerticalAlignment="Center" x:Name="pageInfo"/>
        <Button Padding="10,0,10,0" Margin="1"  Content="&gt;" Click="MoveToNextPage"/>
    </StackPanel>
    
  1. 次のコードを追加します。PropertyChanged イベントの RefreshPageInfo ハンドラは、現在のページ番号とページ数を表示するために使用され、ボタンの Click イベントのハンドラは、次/前のページへの移動に使用されます。
Visual Basic
コードのコピー
Imports C1.Data.DataSource
Public Class Paging
     Private _view As ClientCollectionView
     Public Sub New()
         InitializeComponent()
         _view = C1DataSource1("Orders")
         RefreshPageInfo()
         AddHandler _view.PropertyChanged, AddressOf RefreshPageInfo
     End Sub
     Private Sub RefreshPageInfo()
         pageInfo.Text = String.Format("{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

C#
コードのコピー
using C1.Data.DataSource;

namespace TutorialsWPF
{
    public partial class Paging : Window
    {
        ClientCollectionView _view;

        public Paging()
        {
            InitializeComponent();

            _view = c1DataSource1["Orders"];

            RefreshPageInfo();
            _view.PropertyChanged += delegate { RefreshPageInfo(); };
        }

        private void RefreshPageInfo()
        {
            labelPage.Text = string.Format("{0} / {1}",
         _view.PageIndex + 1, _view.PageCount);
        }

        private void MoveToPrevPage(object sender, RoutedEventArgs e)
        {
            _view.MoveToPreviousPage();
        }

        private void MoveToNextPage(object sender, RoutedEventArgs e)
        {
            _view.MoveToNextPage();
        }
    }
}

  1. アプリケーションを保存、ビルド、および実行します。Orders 間をページ移動します。ページ間を移動しながら、グリッドでいくつかのデータを変更してみます。1つのページでデータを変更してから別のページに移動し、そのページでもデータを変更します。C1DataSource では、変更したページをデータベースに保存しなくても、次のページに移動できることに注目してください。これは、Microsoft RIA サービスの DomainDataSource で実装されているようなページングより優れた重要な機能です。Microsoft RIA サービスの DomainDataSource で実装されているページングは Silverlight 用ですが、EF DataSource では、3つすべてのプラットフォーム(WinForms、WPF、Silverlight)で、他の機能と同様にこのページングの実装がサポートされています。
  2. また、いくつかの注文を削除してみます。この操作も制限なく実行することができます。さらに、現在のページが自動的に更新されて、ページ内の行数が維持されます。
  3. 以前の同様に次のコードを使用して[変更の保存]ボタンを追加すると、そのボタンを使用して、複数のページに加えた変更を一度に保存することができます。
Visual Basic
コードのコピー
Private Sub btnSaveChanges_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
     c1DataSource1.ClientCache.SaveChanges()
End Sub

C#
コードのコピー
private void btnSaveChanges_Click(object sender, RoutedEventArgs e)
{
    c1DataSource1.ClientCache.SaveChanges();
}

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

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