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

WinForm 应用程序中 DataGridView 的简单分页方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (25投票s)

2011年6月15日

CPOL

1分钟阅读

viewsIcon

197567

downloadIcon

10352

轻松分页 DataGridView 的简单方法。

引言

我最近在 WinForm 应用程序的 DataGridView 中实现了分页功能。我在网上搜索过,但通常发现代码非常复杂。因此,我想编写易于理解的代码,让每个人都能理解。经过一些修改,我努力使我的代码真正简单,并希望与大家分享。

PagingInDataGridView/image001.jpg

我使用了按钮控件来实现导航切换。

我添加了所需的变量,例如 PgSize 用于每页的行数,CurrentPageIndex 用于当前页索引,以及 Totalpage 用于计算 DataGridView 能够显示的最大页数。

private int PgSize = 20; 
private int CurrentPageIndex = 1;
private int TotalPage=0; 

顾名思义,以下方法用于计算 gridview 的总页数

private void CalculateTotalPages()
{
    int rowCount = ds.Tables["Customers"].Rows.Count;
    TotalPage = rowCount / PgSize;
    // if any row left after calculated pages, add one more page 
    if (rowCount % PgSize > 0)
        TotalPage += 1;
}

为了检索要显示的已导航页面的记录,我使用了从 GetCurrentRecord() 方法返回的 DataTable 作为 gridviewdatasource。如果导航的页面是第一页,则此方法返回前 20 行(PgSize 变量的 Size)。如果导航的页面大于 1,则它通过以下代码行计算先前的 pageOffset

int PreviousPageOffSet= (page - 1) * PgSize; 

现在查询工作开始,只选择当前页面的页面,并留下之前的记录,应用以下代码中的查询

private DataTable GetCurrentRecords(int page, SqlConnection con)
{
    DataTable dt = new DataTable();

    if (page == 1)
    {
        cmd2 = new SqlCommand("Select TOP " + PgSize + 
		" * from Customers ORDER BY CustomerID", con);
    }
    else
    {
        int PreviousPageOffSet= (page - 1) * PgSize;

        cmd2 = new SqlCommand("Select TOP " + PgSize +
        	" * from Customers WHERE CustomerID NOT IN " +
        	"(Select TOP " + PreviousPageOffSet+ 
	" CustomerID from customers ORDER BY CustomerID) ", con);
    }
    try
    {
        // con.Open();
        this.adp1.SelectCommand = cmd2;
        this.adp1.Fill(dt);
    }
    finally
    {
        con.Close();
    }
    return dt;
}

导航按钮与往常一样。在这里,我们只计算导航的 pageIndex 并将其作为参数传递给 GetCurrentRecords() 方法,以检索 datagridviewdataSource

    private void btnFirstPage_Click(object sender, EventArgs e)
    {
        this.CurrentPageIndex = 1;
        this.dataGridView1.DataSource = GetCurrentRecords(this.CurrentPageIndex, con);
    }

    private void btnNxtPage_Click(object sender, EventArgs e)
    {
        if (this.CurrentPageIndex < this.TotalPage)
        {
            this.CurrentPageIndex++;
            this.dataGridView1.DataSource = 
		GetCurrentRecords(this.CurrentPageIndex, con);
        }
    }

    private void btnPrevPage_Click(object sender, EventArgs e)
    {
        if (this.CurrentPageIndex > 1)
        {
            this.CurrentPageIndex--;
            this.dataGridView1.DataSource = 
		GetCurrentRecords(this.CurrentPageIndex, con);
        } 
    }

    private void btnLastPage_Click(object sender, EventArgs e)
    {
        this.CurrentPageIndex = TotalPage;
        this.dataGridView1.DataSource = GetCurrentRecords(this.CurrentPageIndex, con); 
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close(); 
    }
  }
}

我希望这是为 DataGridView 分页的最简单方法。

这是我发布的第一篇文章,我尽力解释了我的代码。因此,我欢迎任何类型的建议。

历史

  • 2011 年 6 月 15 日:初始版本
© . All rights reserved.