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