.NET CFVisual Studio .NET 2002.NET 1.0Visual Studio .NET 2003WebForms.NET 1.1.NET 3.0Visual Studio 2005.NET 2.0Windows Forms移动应用C# 2.0C# 3.0WPF中级开发Visual StudioWindows.NETASP.NETC#
.NET 分页类






2.44/5 (4投票s)
2007年9月17日
1分钟阅读

27421

244
一个可用于分页的可定制类。
引言
我在之前的文章中解释了一种实现自定义分页的方法。使用相同的逻辑,我创建了一个自定义类,可以像 .NET 2.0 中的 PagedDataSource
类一样轻松地用于自定义分页。
这是类 SPagingSource
{
#region Private Members
private DataTable _dtSource = new DataTable();
private DataTable _dtDataSource = new DataTable();
private int _pageIndex = 1;
private int _pageSize = 20;
private enum PagingMode { First = 1, Next = 2, Previous = 3, Last = 4 };
#endregion
#region Properties
public DataTable SourceData
{
set
{
_dtSource = value;
}
}
public DataView DataSource
{
get
{
if (_dtDataSource.Rows.Count <= 0)
{
CustomPaging((int)PagingMode.First);
}
return _dtDataSource.DefaultView;
}
}
public int PageIndex
{
get
{
return _pageIndex;
}
}
public int MoveTo
{
set
{
if (_pageIndex == value)
{
_pageIndex = value;
}
else if (_pageIndex < value)
{
_pageIndex = value-1;
CustomPaging((int)PagingMode.Next);
}
else if (_pageIndex > value)
{
_pageIndex = value + 1;
CustomPaging((int)PagingMode.Previous);
}
}
}
public int PageSize
{
get
{
return _pageSize;
}
set
{
_pageSize = value;
}
}
public int PageNumber
{
get
{
return _pageIndex;
}
}
public bool IsFirstPage
{
get
{
if (_pageIndex == 1)
{
return true;
}
else
{
return false;
}
}
}
public bool IsLastPage
{
get
{
if (_pageIndex == (_dtSource.Rows.Count/_pageSize))
{
return true;
}
else
{
return false;
}
}
}
#endregion
#region Private Functions
public void Next()
{
CustomPaging((int)PagingMode.Next);
}
public void Previous()
{
CustomPaging((int)PagingMode.Previous);
}
public void First()
{
CustomPaging((int)PagingMode.First);
}
public void Last()
{
CustomPaging((int)PagingMode.Last);
}
private void CustomPaging(int mode)
{
if (_dtSource.Rows.Count <= _pageSize)
{
return;
}
switch (mode)
{
case (int)PagingMode.Next:
if (_dtSource.Rows.Count > (_pageIndex * _pageSize))
{
DataTable tmpTable = new DataTable();
tmpTable = _dtSource.Clone();
if (_dtSource.Rows.Count >= ((_pageIndex * _pageSize) +
_pageSize))
{
for (int i = _pageIndex * _pageSize; i < ((
_pageIndex * _pageSize) + _pageSize); i++)
{
tmpTable.ImportRow(_dtSource.Rows[i]);
}
}
else
{
for (int i = _pageIndex * _pageSize; i <
_dtSource.Rows.Count; i++)
{
tmpTable.ImportRow(_dtSource.Rows[i]);
}
}
_pageIndex += 1;
_dtDataSource = tmpTable;
tmpTable.Dispose();
}
break;
case (int)PagingMode.Previous:
if (_pageIndex > 1)
{
DataTable tmpTable = new DataTable();
tmpTable = _dtSource.Clone();
_pageIndex -= 1;
for (int i = ((_pageIndex * _pageSize) - _pageSize); i < (
_pageIndex * _pageSize); i++)
{
tmpTable.ImportRow(_dtSource.Rows[i]);
}
_dtDataSource = tmpTable;
tmpTable.Dispose();
}
break;
case (int)PagingMode.First:
_pageIndex = 2;
CustomPaging((int)PagingMode.Previous);
break;
case (int)PagingMode.Last:
_pageIndex = (_dtSource.Rows.Count / _pageSize);
CustomPaging((int)PagingMode.Next);
break;
}
}
#endregion
}
只需复制粘贴或下载附带的源代码。如果复制/粘贴,请在您的项目中创建一个新类。将此代码复制到该类中,除了类定义之外。如果下载,请将此类添加到项目中。添加您的命名空间。如果需要,更改类名。
现在我们有了分页类。我将演示如何使用这个类。首先,为该类创建一个具有页面级范围的对象,
SPagingSource sPS = new SPagingSource();
在绑定数据部分
ds.Tables[0] = //Datasource //Assigning the datasource to the 'sPS' object. sPS.SourceData = ds.Tables[0]; //Setting the page size. sPS.PageSize = 10; //Assign the page class object as the datasource. ListView1.DataContext = sPS.DataSource; (WPF) OR DataView1.DataSource = sPS.DataSource; (.Net2.0)
现在我们有了网格/列表,其中包含前 10 条记录(这里我将页面大小设置为 10)。对于导航,我们只需要调用分页类对象的 Next、Previous、Last 和 First 方法,并重新分配数据源。例如,要显示下一组记录,
sPS.Next(); ListView1.DataContext = sPS.DataSource;
您还可以使用该类对象的 MoveTo
属性移动到某个页面。
sPS.MoveTo = 3;
ListView1.DataContext = sPS.DataSource;
还有一些有用的属性,例如获取当前页面索引。
Label1.Text = sPS.PageNumber;
要检查我们是否在 Lastpage/Firstpage,我们有
sPS.IsLastPage
sPS.IsFirstPage boolean properties.
最后,您可以修改该类以满足您的需求。