65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 分页类

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.44/5 (4投票s)

2007年9月17日

1分钟阅读

viewsIcon

27421

downloadIcon

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.

最后,您可以修改该类以满足您的需求。

© . All rights reserved.