Wpf DataGrid
でページングを設定するにはどうすればよいですか?
上記のコードプロジェクトの記事は、ADOテーブルでこれを行うのに非常に適しています。ほとんどのアプリケーションでは、うまく動作する可能性が高く、理解しやすいですが、「WPF-また、CollectionViewsを使用することにもなります。上記の例と比較してCollectionViewを使用する利点は、グリッドに入れるデータに関して少し一般的であるということです(その例をより一般的にすることはできないというわけではなく)、一般的なWPFデータバインディングモデルによく適合します。必要に応じて、並べ替え、グループ化などの一般的な操作をサポートする場所を提供します。
.NET 4.0 DataGridコントロールにバインドされた、ほとんど機能しないPagingCollectionViewの非常に短い例をまとめました。例自体は非常に簡単ですが、MoveToNextPageやMoveToPreviousPageなどの単純な操作を実行できる実際のデータコレクションの周りにプロキシがあるため、少なくとも開始方法を示しています。
Windowイベント処理とPagingCollectionViewの両方のC#は次のとおりです。
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
namespace GridPagingExample
{
public partial class MainWindow : Window
{
private readonly PagingCollectionView _cview;
public MainWindow()
{
InitializeComponent();
this._cview = new PagingCollectionView(
new List<object>
{
new { Animal = "Lion", Eats = "Tiger" },
new { Animal = "Tiger", Eats = "Bear" },
new { Animal = "Bear", Eats = "Oh my" },
new { Animal = "Wait", Eats = "Oh my isn't an animal" },
new { Animal = "Oh well", Eats = "Who is counting anyway" },
new { Animal = "Need better content", Eats = "For posting on stackoverflow" }
},
2
);
this.DataContext = this._cview;
}
private void OnNextClicked(object sender, RoutedEventArgs e)
{
this._cview.MoveToNextPage();
}
private void OnPreviousClicked(object sender, RoutedEventArgs e)
{
this._cview.MoveToPreviousPage();
}
}
public class PagingCollectionView : CollectionView
{
private readonly IList _innerList;
private readonly int _itemsPerPage;
private int _currentPage = 1;
public PagingCollectionView(IList innerList, int itemsPerPage)
: base(innerList)
{
this._innerList = innerList;
this._itemsPerPage = itemsPerPage;
}
public override int Count
{
get
{
if (this._innerList.Count == 0) return 0;
if (this._currentPage < this.PageCount) // page 1..n-1
{
return this._itemsPerPage;
}
else // page n
{
var itemsLeft = this._innerList.Count % this._itemsPerPage;
if (0 == itemsLeft)
{
return this._itemsPerPage; // exactly itemsPerPage left
}
else
{
// return the remaining items
return itemsLeft;
}
}
}
}
public int CurrentPage
{
get { return this._currentPage; }
set
{
this._currentPage = value;
this.OnPropertyChanged(new PropertyChangedEventArgs("CurrentPage"));
}
}
public int ItemsPerPage { get { return this._itemsPerPage; } }
public int PageCount
{
get
{
return (this._innerList.Count + this._itemsPerPage - 1)
/ this._itemsPerPage;
}
}
private int EndIndex
{
get
{
var end = this._currentPage * this._itemsPerPage - 1;
return (end > this._innerList.Count) ? this._innerList.Count : end;
}
}
private int StartIndex
{
get { return (this._currentPage - 1) * this._itemsPerPage; }
}
public override object GetItemAt(int index)
{
var offset = index % (this._itemsPerPage);
return this._innerList[this.StartIndex + offset];
}
public void MoveToNextPage()
{
if (this._currentPage < this.PageCount)
{
this.CurrentPage += 1;
}
this.Refresh();
}
public void MoveToPreviousPage()
{
if (this._currentPage > 1)
{
this.CurrentPage -= 1;
}
this.Refresh();
}
}
}
ウィンドウのXAMLは次のとおりです。
<Window x:Class="GridPagingExample.MainWindow"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Grid.Row="0">
<Label Grid.Row="0" Margin="2">
<Label.Content>
<Binding Path="CurrentPage">
<Binding.StringFormat>Current Page: {0}</Binding.StringFormat>
</Binding>
</Label.Content>
</Label>
<Button Content="Next" Click="OnNextClicked" Margin="2"/>
<Button Content="Previous" Click="OnPreviousClicked" Margin="2"/>
</StackPanel>
<DataGrid ItemsSource="{Binding}" Grid.Row="1">
<DataGrid.Columns>
<DataGridTextColumn Header="Animal" Width="*" Binding="{Binding Animal}"/>
<DataGridTextColumn Header="Eats" Width="*" Binding="{Binding Eats}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
このCollectionViewを構築して、MoveToLastPageやMoveToFirstPageなどの些細な機能や、並べ替えなどの動作をさらに考慮した機能をサポートすることができます。お役に立てば幸いです。