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

使用 DataReader 的 DataGrid 分页 - C# Windows 窗体

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.20/5 (9投票s)

2006年11月9日

CPOL
viewsIcon

80359

downloadIcon

1507

使用 DataReader 进行 DataGrid 分页。

Sample Image - DataGridPaging_DataReader.gif

引言

这是一个使用 C# 对 Windows Forms DataGrid 进行分页的示例。 在演示中,我使用了 Microsoft SQL Server 2000 数据库。

使用代码

创建表

CREATE TABLE tblEmp (E_ID int PRIMARY KEY, E_Name varchar(60), 
                     E_Salary money, E_DOJ datetime)
GO

公共变量

// Protected Connection.
protected SqlConnection mcnSample;

// Page
private int mintTotalRecords = 0;
private int mintPageSize = 0;
private int mintPageCount = 0;
private int mintCurrentPage = 1;

// Connection String
protected const string CONNECTION_STRING = 
          "Server=localhost;UID=sa;PWD=;Database=Sample";

fillGrid() 方法

private void fillGrid()
{
    // For Page view.
    this.mintPageSize = int.Parse(this.tbPageSize.Text);
    this.mintTotalRecords = getCount();
    this.mintPageCount = this.mintTotalRecords / this.mintPageSize;
    
    // Adjust page count if the last page contains partial page.
    if (this.mintTotalRecords % this.mintPageSize > 0)
        this.mintPageCount++;

    this.mintCurrentPage = 0;

    loadPage();
}

getCount() 方法:此方法比 SELECT COUNT(*) 语句获取记录数的速度更快。

private int getCount()
{
    // This select statement is very fast compare to SELECT COUNT(*)
    string strSql = "SELECT Rows FROM SYSINDEXES WHERE " + 
                    "Id = OBJECT_ID('tblEmp') AND IndId < 2";
    int intCount = 0;

    SqlCommand cmd = this.mcnSample.CreateCommand();
    cmd.CommandText = strSql;

    intCount = (int) cmd.ExecuteScalar();
    cmd.Dispose();

    return intCount;
}

loadPage() 方法

private void loadPage()
{
    string strSql = "";
    int intSkip = 0, i = 0;
    SqlDataReader dr;
    DataSet ds;
    DataTable dt;

    intSkip = (this.mintCurrentPage * this.mintPageSize);

    strSql = "SELECT * FROM tblEmp";

    SqlCommand cmd = this.mcnSample.CreateCommand();
    cmd.CommandText = strSql;

    dr = cmd.ExecuteReader(); 
    ds = new DataSet();

    dt = ds.Tables.Add("tblEmp");

    // Add the table columns.
    for (i = 0; i < dr.FieldCount; i++) 
        dt.Columns.Add(dr.GetName(i), dr.GetFieldType(i)); 

    int intIdx = 0;
    while (dr.Read())
    {
        if (intIdx >= intSkip)
        {
            DataRow r = dt.NewRow();

            // Assign DataReader values to DataRow.
            for (i = 0; i < dr.FieldCount; i++)
                r[i] = dr[i];

            dt.Rows.Add(r);
        }

        if ((intIdx - intSkip) >= (this.mintPageSize - 1))
            break;

        intIdx++;
    }

    dr.Close();

    // Populate Data Grid
    this.dgEmp.DataSource = ds.Tables["tblEmp"].DefaultView;

    // Show Status
    this.lblStatus.Text = (this.mintCurrentPage + 1).ToString() + 
                           " / " + this.mintPageCount.ToString();

    cmd.Dispose();
    ds.Dispose();
}

以下是页面导航的代码

private void goFirst()
{
    this.mintCurrentPage = 0;

    loadPage();
}

private void goPrevious()
{
    if (this.mintCurrentPage == this.mintPageCount)
        this.mintCurrentPage = this.mintPageCount - 1;

    this.mintCurrentPage--;

    if (this.mintCurrentPage < 1) 
        this.mintCurrentPage = 0;

    loadPage();
}

private void goNext()
{
    this.mintCurrentPage++;

    if (this.mintCurrentPage > (this.mintPageCount - 1))
        this.mintCurrentPage = this.mintPageCount - 1;

    loadPage();
}

private void goLast()
{
    this.mintCurrentPage = this.mintPageCount - 1;

    loadPage();
}

历史

  • 发布于 2006 年 11 月 9
© . All rights reserved.