先查询数据源,再分页:
先写一个控件:
控件C#:
public partial class Pager : UserControl
{
public Pager()
{
InitializeComponent();
prePageBtn.IsEnabled = false;
}
private DataTable _dt = new DataTable();
//每页显示多少条
private int pageNum = 25;
//当前是第几页
private int pIndex = 1;
//对象
private DataGrid grdList;
//最大页数
private int MaxIndex = 1;
//一共多少条
private int allNum = 0;
#region 初始化数据
///
/// 初始化数据
///
///
///
///
public void ShowPages(DataGrid grd, DataTable dt)
{
if (dt == null || dt.Rows.Count == 0)
{
Visibility = Visibility.Hidden;
return;
}
_dt = dt.Clone();
grdList = grd;
pIndex = 1;
foreach (DataRow r in dt.Rows)
_dt.ImportRow(r);
SetMaxIndex();
ReadDataTable();
}
#endregion
#region 画数据
///
/// 画数据
///
private void ReadDataTable()
{
try
{
pageNoTbk.Text = pIndex.ToString();
pageCountTbk.Text = MaxIndex.ToString();
DataTable tmpTable = new DataTable();
tmpTable = _dt.Clone();
int first = pageNum * (pIndex - 1);
first = (first > 0) ? first : 0;
//如何总数量大于每页显示数量
if (_dt.Rows.Count >= pageNum * pIndex)
{
for (int i = first; i < pageNum * pIndex; i++)
tmpTable.ImportRow(_dt.Rows[i]);
}
else
{
for (int i = first; i <_dt.Rows.Count; i++)
tmpTable.ImportRow(_dt.Rows[i]);
}
grdList.ItemsSource = tmpTable.DefaultView;
currentCountTbk.Text = grdList.Items.Count.ToString();
totalCountTbk.Text = _dt.Rows.Count.ToString();
tmpTable.Dispose();
}
catch
{
MessageBox.Show("错误");
}
finally
{
DisplayPagingInfo();
}
}
#endregion
#region 每页显示等数据
///
/// 每页显示等数据
///
private void DisplayPagingInfo()
{
if (MaxIndex == 1)
{
firstPageBtn.IsEnabled = false;
prePageBtn.IsEnabled = false;
nextPageBtn.IsEnabled = false;
lastPageBtn.IsEnabled = false;
}
else
{
if (pIndex == 1)
{
firstPageBtn.IsEnabled = false;
prePageBtn.IsEnabled = false;
nextPageBtn.IsEnabled = true;
lastPageBtn.IsEnabled = true;
}
else if (pIndex==MaxIndex)
{
firstPageBtn.IsEnabled = true;
prePageBtn.IsEnabled = true;
nextPageBtn.IsEnabled = false;
lastPageBtn.IsEnabled = false;
}
else
{
firstPageBtn.IsEnabled = true;
prePageBtn.IsEnabled = true;
nextPageBtn.IsEnabled = true;
nextPageBtn.IsEnabled = true;
}
}
}
#endregion
#region 设置最多大页面
///
/// 设置最多大页面
///
private void SetMaxIndex()
{
//多少页
int Pages = _dt.Rows.Count / pageNum;
if (_dt.Rows.Count != (Pages * pageNum))
{
if (_dt.Rows.Count < (Pages * pageNum))
Pages--;
else
Pages++;
}
MaxIndex = Pages;
allNum = _dt.Rows.Count;
}
#endregion
private void Tbl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
TextBlock tbl = sender as TextBlock;
if (tbl == null)
return;
int index = int.Parse(tbl.Text.ToString());
pIndex = index;
if (index > MaxIndex)
pIndex = MaxIndex;
if (index < 1)
pIndex = 1;
ReadDataTable();
}
private void FirstPageBtn_Click(object sender, RoutedEventArgs e)
{
pIndex = 1;
ReadDataTable();
}
private void PrePageBtn_Click(object sender, RoutedEventArgs e)
{
if (pIndex <= 1)
return;
pIndex--;
ReadDataTable();
}
private void NextPageBtn_Click(object sender, RoutedEventArgs e)
{
if (pIndex >= MaxIndex)
return;
pIndex++;
ReadDataTable();
}
private void LastPageBtn_Click(object sender, RoutedEventArgs e)
{
pIndex = MaxIndex;
ReadDataTable();
}
private void GotoBtn_Click(object sender, RoutedEventArgs e)
{
if (gotoPageNoTb.Text == "")
return;
if (Convert.ToInt32(gotoPageNoTb.Text) == pIndex|| Convert.ToInt32(gotoPageNoTb.Text)>MaxIndex|| Convert.ToInt32(gotoPageNoTb.Text)<=0)
return;
pIndex = Convert.ToInt32(gotoPageNoTb.Text);
ReadDataTable();
}
}
引用控件的XAML:
xmlns:app="clr-namespace:命名空间