クライアントに大量のデータを一度に取り込むことなく表示するには、従来、ページングが使用されてきました。インタフェースが複雑になり、ユーザーにとってもあまり便利ではないため、ページングは理想的なソリューションと言えません。ただし、ページングの方が好ましいアプリケーションもあります。このような場合のために、C1DataSource はページングをサポートしています。しかも、これまでようにデータ変更が制限されることはありません。ユーザーは、1つのセッションで複数のページを変更できます。次のページに進む前に、前のページの変更をデータベースに送信する必要もありません。これは、Microsoft RIA サービスの DomainDataSource で実装されているようなページングよりはるかに優れています。
ページングを実装するには、次の手順に従います。
「マスター/詳細連結|document=WordDocuments\C1DataStudio-WPF.docx;topic=Master-Detail Binding」の説明で作成したプロジェクトを使用します。前と同様に、同じ ObjectContextType を使用して、C1DataSource コンポーネントを含む新しいフォームを追加します。このフォームをスタートアップフォームにすることで、プロジェクトの実行にかかる時間を短縮することができます。
ItemsSource="{Binding ElementName=c1DataSource1, Path=Orders}"
XAML |
コードのコピー
|
---|---|
<StackPanel Orientation="Horizontal" Grid.Row="1" Margin="2"> <Button Padding="10,0,10,0" Margin="1" Content="<" Click="MoveToPrevPage"/> <TextBlock VerticalAlignment="Center" Text="Page: "/> <TextBlock VerticalAlignment="Center" x:Name="pageInfo"/> <Button Padding="10,0,10,0" Margin="1" Content=">" Click="MoveToNextPage"/> </StackPanel> |
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(); } } }
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 に実装されているページングは、パフォーマンスとメモリ消費の両面で最適化されています。この最適化は、キャッシュによって実現されています。最近開いたページがメモリに保存されるので、通常は、同じページを再度開くと瞬時に表示されます。また、メモリリソースが管理され(古いページは必要に応じて解放されます)、メモリリークが防止されます。