C# datagridview分頁功能


  winform開發是或多或少都會接觸datagridview控件,如果數據量大,那么必須使用分頁功能,但是datagridview自身並沒有分頁,所以我們要自己實現。在網上搜了一些發現沒有太適合自己的,要么嫌代碼過於多不想看,要么自己理解差無法明白其原理,所以打算自己寫一個,也希望幫到大家。

第一步:設置4個變量分別記錄每頁記錄數、總記錄數、總頁數、當前頁

        /// <summary>
        /// 每頁記錄數
        /// </summary>
        public int pageSize = 100;

        /// <summary>
        /// 總記錄數
        /// </summary>
        public int recordCount = 0;

        /// <summary>
        /// 總頁數
        /// </summary>
        public int pageCount = 0;

        /// <summary>
        /// 當前頁
        /// </summary>
        public int currentPage = 0;  

第二步:構造一個虛擬table用於顯示(這里不連接數據庫,如果需要自行更改),並算出總頁數、總記錄數。

DataTable table = new DataTable();

/// <summary>
/// 分頁的方法
/// </summary>
/// <param name="str"></param>
private void PageSorter()     
{ 

    //創建虛擬表
    DataColumn column1 = new DataColumn("test1", Type.GetType("System.String"));  
    DataColumn column2 = new DataColumn("test2", Type.GetType("System.String"));
    DataColumn column3 = new DataColumn("test3", Type.GetType("System.String"));

    table.Columns.Add(column1);             //將列添加到table表中
    table.Columns.Add(column2);
    table.Columns.Add(column3);
    for (int i = 1; i <= 30000; i++)
    {
        DataRow dr = table.NewRow();            //table表創建行
        dr["test1"] = "資產編號" + i.ToString();
        dr["test2"] = "資產名稱" + i.ToString();
        dr["test3"] = "規格型號" + i.ToString();
        table.Rows.Add(dr);                     //將數據加入到table表中
    }

    recordCount = table.Rows.Count;     //記錄總行數
    pageCount = (recordCount / pageSize);
    if ((recordCount % pageSize) > 0)
    {
        pageCount++;
    }

    //默認第一頁
    currentPage = 1;

    LoadPage( );//調用加載數據的方法
}

第三步:進行加載顯示數據

/// <summary>
/// LoadPage方法
/// </summary>
private void LoadPage( )
{
    if (currentPage < 1) currentPage = 1;
    if (currentPage > pageCount) currentPage = pageCount;

    int beginRecord;    //開始指針
    int endRecord;      //結束指針
    DataTable dtTemp;
    dtTemp = table.Clone();

    beginRecord = pageSize * (currentPage - 1);
    if (currentPage == 1) beginRecord = 0;
    endRecord = pageSize * currentPage;

    if (currentPage == pageCount) endRecord = recordCount;
    for (int i = beginRecord; i < endRecord; i++)
    {
        dtTemp.ImportRow(table.Rows[i]);
    } 

    dataGridView1.Rows.Clear();

    for (int i = 0; i < dtTemp.Rows.Count; i++)
    { 
        dataGridView1.Rows.Add(new object[] { dtTemp.Rows[i][0] , dtTemp.Rows[i][1] , dtTemp.Rows[i][2] });
    } 

    labPageIndex.Text = "當前頁: " + currentPage.ToString() + " / " + pageCount.ToString();//當前頁
    labRecordCount.Text = "總行數: " + recordCount.ToString() + "";//總記錄數
}

第四步:設置按鈕點擊事件

/// <summary>
/// 首頁
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnFirst_Click(object sender, EventArgs e)
{
    if (currentPage == 1)
    { return; }
    currentPage = 1;
    LoadPage();
}
/// <summary>
/// 上一頁
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPrev_Click(object sender, EventArgs e)
{
    if (currentPage == 1)
    { return; }
    currentPage--;
    LoadPage();
}
/// <summary>
/// 下一頁
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnNext_Click(object sender, EventArgs e)
{
    if (currentPage == pageCount)
    { return; }
    currentPage++;
    LoadPage();
}
/// <summary>
/// 尾頁
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnLast_Click(object sender, EventArgs e)
{
    if (currentPage == pageCount)
    { return; }
    currentPage = pageCount;
    LoadPage();
}

第五步:load事件加載時顯示數據

private void Form1_Load(object sender, EventArgs e)
{
    PageSorter();//分頁 
}

最終展示結果

最后附上源碼地址

  鏈接: https://pan.baidu.com/s/1J4qI5RZ2AhV3ycml2a2htA

  提取碼: 49ie


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM