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;
                }
            });

  

posted @ 2021-08-27 14:01  zzia615  阅读(349)  评论(0)    收藏  举报