winform中DataGridView代码分页
效果图如下

后台代码
public partial class ucDGVPage : UserControl
{
public DataTable DataSource
{
get
{
if (table_filter == null)
return table;
else
return table_filter;
}
}
DataGridView dgv;
DataTable table;
DataTable table_filter;
[Category("分页控件"),Description("页大小"),DefaultValue(100)]
public int PageSize
{
get
{
return pageSize;
}
set
{
pageSize = value;
}
}
[Category("分页控件"), Description("是否显示分页按钮"), DefaultValue(true)]
public bool ShowPageButton
{
get
{
return showPageButton;
}
set
{
showPageButton = value;
}
}
bool showPageButton = true;
int pageSize = 100;
int pageCount;
int currentPage;
Action SetDgv;
public ucDGVPage()
{
InitializeComponent();
}
public void Filter(string filter)
{
if (string.IsNullOrEmpty(filter))
{
SetPageOption(dgv, table, SetDgv);
table_filter = null;
}
else
{
table.DefaultView.RowFilter = filter;
var tmp = table.DefaultView.ToTable();
SetPageOptionFilter(dgv, tmp, SetDgv);
}
}
public void Find(string[] columns,string str)
{
int findIndex = 0;
DataTable tmp = null;
if (table_filter == null)
{
tmp = table;
}
else
{
tmp = table_filter;
}
for (int index = 0; index < tmp.Rows.Count; index++)
{
DataRow row = tmp.Rows[index];
foreach (string col in columns)
{
if (row[col].AsString().Contains(str))
{
findIndex = index;
break;
}
}
if (findIndex > 0) break;
}
int page = (findIndex + 1) / pageSize;
if(page*pageSize< findIndex + 1)
{
page++;
}
int selectedIndex = (findIndex+1) - (page - 1) * pageSize;
if (table_filter == null)
SelectPage(page);
else
SelectPageFilter(page);
//定位到指定行(样式)
dgv.ClearSelection();
dgv.Rows[(selectedIndex-1)].Selected = true;
//让指定行处于选中状态(状态)
dgv.CurrentCell = dgv.Rows[(selectedIndex - 1)].Cells[0];
dgv.CurrentRow.Selected = true;
}
public void SetPageOption(DataGridView dgv, DataSet ds, Action SetDgv = null)
{
SetPageOption(dgv, ds.Tables[0], SetDgv);
}
public void SetPageOption(DataGridView dgv, DataTable table, Action SetDgv = null)
{
this.dgv = dgv;
this.table = table;
this.SetDgv = SetDgv;
if (pageSize == 0)
{
pageCount = 0;
}
else
{
pageCount = table.Rows.Count / pageSize;
}
if(pageCount* pageSize< table.Rows.Count)
{
pageCount++;
}
if (!showPageButton)
{
button1.Visible = false;
button2.Visible = false;
button3.Visible = false;
button4.Visible = false;
}
lbTotalSize.Text = table.Rows.Count.ToString();
SelectPage(1);
}
void SetPageOptionFilter(DataGridView dgv, DataTable table, Action SetDgv = null)
{
this.dgv = dgv;
this.table_filter = table;
this.SetDgv = SetDgv;
if (pageSize == 0)
{
pageCount = 0;
}
else
{
pageCount = table.Rows.Count / pageSize;
}
if (pageCount * pageSize < table.Rows.Count)
{
pageCount++;
}
if (!showPageButton)
{
button1.Visible = false;
button2.Visible = false;
button3.Visible = false;
button4.Visible = false;
}
lbTotalSize.Text = table_filter.Rows.Count.ToString();
SelectPageFilter(1);
}
void SelectPage(int page)
{
currentPage = page;
lbPage.Text = string.Format("{0}/{1}", page, pageCount);
button1.Enabled = true;
button2.Enabled = true;
button3.Enabled = true;
button4.Enabled = true;
if (page == 1 || pageCount == 0)
{
button1.Enabled = false;
button4.Enabled = false;
}
if (page == pageCount || pageCount == 0)
{
button2.Enabled = false;
button3.Enabled = false;
}
DataTable newTable = null;
if (pageCount > 0)
{
newTable = table.Rows.Cast<DataRow>().Skip((page - 1) * pageSize).Take(pageSize).CopyToDataTable();
}
else
{
newTable = table;
}
lbPageSize.Text = newTable.Rows.Count.ToString();
dgv.DataSource = null;
dgv.DataSource = newTable;
if (SetDgv!=null)
{
SetDgv();
}
}
void SelectPageFilter(int page)
{
currentPage = page;
lbPage.Text = string.Format("{0}/{1}", page, pageCount);
button1.Enabled = true;
button2.Enabled = true;
button3.Enabled = true;
button4.Enabled = true;
if (page == 1 || pageCount == 0)
{
button1.Enabled = false;
button4.Enabled = false;
}
if (page == pageCount || pageCount == 0)
{
button2.Enabled = false;
button3.Enabled = false;
}
DataTable newTable = null;
if (pageCount > 0)
{
newTable = table_filter.Rows.Cast<DataRow>().Skip((page - 1) * pageSize).Take(pageSize).CopyToDataTable();
}
else
{
newTable = table_filter;
}
lbPageSize.Text = newTable.Rows.Count.ToString();
dgv.DataSource = null;
dgv.DataSource = newTable;
if (SetDgv != null)
{
SetDgv();
}
}
private void button1_Click(object sender, EventArgs e)
{
if (currentPage == 1) return;
SelectPage(currentPage - 1);
}
private void button4_Click(object sender, EventArgs e)
{
if (currentPage == 1) return;
SelectPage(1);
}
private void button3_Click(object sender, EventArgs e)
{
if (currentPage == pageCount) return;
SelectPage(pageCount);
}
private void button2_Click(object sender, EventArgs e)
{
if (currentPage == pageCount) return;
SelectPage(currentPage + 1);
}
}
另附上design.cs代码
namespace MDM.Forms.Cust
{
partial class ucDGVPage
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.button4 = new System.Windows.Forms.Button();
this.lbPage = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.lbTotalSize = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.lbPageSize = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(394, 3);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "上一页";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(475, 3);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 1;
this.button2.Text = "下一页";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button3
//
this.button3.Location = new System.Drawing.Point(556, 3);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(75, 23);
this.button3.TabIndex = 2;
this.button3.Text = "末页";
this.button3.UseVisualStyleBackColor = true;
this.button3.Click += new System.EventHandler(this.button3_Click);
//
// button4
//
this.button4.Location = new System.Drawing.Point(313, 3);
this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(75, 23);
this.button4.TabIndex = 3;
this.button4.Text = "首页";
this.button4.UseVisualStyleBackColor = true;
this.button4.Click += new System.EventHandler(this.button4_Click);
//
// label1
//
this.lbPage.AutoSize = true;
this.lbPage.Location = new System.Drawing.Point(25, 8);
this.lbPage.Name = "label1";
this.lbPage.Size = new System.Drawing.Size(23, 12);
this.lbPage.TabIndex = 4;
this.lbPage.Text = "0/0";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(3, 8);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(29, 12);
this.label2.TabIndex = 5;
this.label2.Text = "页:";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(198, 8);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(53, 12);
this.label3.TabIndex = 6;
this.label3.Text = "合计数:";
//
// label4
//
this.lbTotalSize.AutoSize = true;
this.lbTotalSize.Location = new System.Drawing.Point(244, 8);
this.lbTotalSize.Name = "label4";
this.lbTotalSize.Size = new System.Drawing.Size(11, 12);
this.lbTotalSize.TabIndex = 7;
this.lbTotalSize.Text = "0";
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(100, 8);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(53, 12);
this.label5.TabIndex = 9;
this.label5.Text = "页大小:";
//
// label6
//
this.lbPageSize.AutoSize = true;
this.lbPageSize.Location = new System.Drawing.Point(146, 8);
this.lbPageSize.Name = "label6";
this.lbPageSize.Size = new System.Drawing.Size(11, 12);
this.lbPageSize.TabIndex = 8;
this.lbPageSize.Text = "0";
//
// ucDGVPage
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.lbPageSize);
this.Controls.Add(this.lbTotalSize);
this.Controls.Add(this.lbPage);
this.Controls.Add(this.button4);
this.Controls.Add(this.button3);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.label5);
this.Controls.Add(this.label2);
this.Controls.Add(this.label3);
this.Name = "ucDGVPage";
this.Size = new System.Drawing.Size(630, 29);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.Button button4;
private System.Windows.Forms.Label lbPage;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label lbTotalSize;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label lbPageSize;
}
}
调用方式:先将DataGridView拖入到一个窗体,然后将自定义的控件拖入。调用如下方法即可。本控件提供Find(查找定位)、Filter(过滤数据)。目前数据源仅支持Datatable或Dataset
ucDGVPage1.SetPageOption(dataGridView1, table, ()=> {
dataGridView2.Columns[0].Frozen = true;
dataGridView2.Columns[1].Frozen = true;
if (dataGridView2.Columns.Count >= 4)
{
dataGridView2.Columns[2].Visible = false;
dataGridView2.Columns[3].Visible = false;
}
});

浙公网安备 33010602011771号