日期:2014-06-10  浏览次数:20683 次

背景

  最近做一个Winform的小程序,需要用到分页,由于之前一直在用 TonyPagerForWinForm.dll ,但该库没有源代码,网上找的也不全面,索性就准备自己改造一个。在园子里翻了一下,发现路过秋天在多年前写了个分页控件,Winform 通用分页控件实战篇(提供源码下载)。站在大神的肩膀上就是快,一会就改好了。

效果图

  功能比较齐全,不过样式上,楼主十分喜欢easyUI或ext的列表分页风格。于是换了几个按钮,添加了图标,看看现在的效果。

  

  控件源码在正文最下方。

使用简介

  就那么一点web分页的感觉了。具体的用法,简单的贴一贴,更详细的可以到秋天的博客里看看,上面有链接。

private void StartForm_Load(object sender, EventArgs e)

        {

            //创建文件数据库表。

            MDataTable.CreateSchema("Users.txt", false, new string[] { "UserName", "Password", "Enabled" }, SqlDbType.NVarChar, SqlDbType.NVarChar, SqlDbType.Bit);

            for (int i = 0; i < 200; i++)//插入200条数据。

            {

                using (MAction action = new MAction("Users.txt", "Txt Path={0}"))

                {

                    action.Set("UserName", "UserName_" + i);

                    action.Set("Password", "Password_" + i);

                    action.Set("Enabled", i%2==0);

                    action.Insert(InsertOp.None);

                }

            }

            pagerControl1.OnPageChanged += new EventHandler(pagerControl1_OnPageChanged);

            LoadData();

        }



        void pagerControl1_OnPageChanged(object sender, EventArgs e)

        {

            LoadData();

        }

        void LoadData()

        {

            int count;

            using (MAction action = new MAction("Users.txt", "Txt Path={0}"))

            {

                action.Select(pagerControl1.PageIndex, pagerControl1.PageSize, string.Empty, out count).Bind(gvUsers);

                pagerControl1.DrawControl(count);

            }

        }

关于Winform

  插点题外话,好久不做Winform,有些渐渐忘记了。这里说几点。

  1.控件随着窗口自适应,设置anchor属性,有top left right down ,根据实际需要设置。

  2.Datagrid绑定数据,如果需要绑定特殊列,如图片,下拉框,则首先指定列头,接着循环创建行,单元格等。

                DataGridViewRow row = new DataGridViewRow();

                DataGridViewTextBoxCell 编号 = new DataGridViewTextBoxCell();
                编号.Value = i++.ToString();
                row.Cells.Add(编号);

                var state = reader["111"].ToString().AsInt(0);
                DataGridViewTextBoxCell OpenClose = new DataGridViewTextBoxCell();
                OpenClose.Value = state > 0 ? "关闭" : "xxxxxx";
                row.Cells.Add(OpenClose);

                var _dval = reader["222"].ToString().AsInt(0);
                DataGridViewTextBoxCell t1 = new DataGridViewTextBoxCell();
                t1.Value = _dval;
                row.Cells.Add(t1);

                var _dmin = reader["333"].ToString().AsInt(0);
                DataGridViewTextBoxCell dmin = new DataGridViewTextBoxCell();
                dmin.Value = _dmin;
                row.Cells.Add(dmin);
            
                //图片列
                DataGridViewImageCell t2 = new DataGridViewImageCell();
                t2.Value = _dval > _dmin ? Properties.Resources.error : Properties.Resources.success;
                row.Cells.Add(t2);

                dataGridView1.Rows.Add(row);

 

  3.DataGrid随着窗口最大化,自动调整列的宽度。

一行代码:

Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;

这就搞定了,效果就是列宽会根据内容以及表头宽度自行判断,最后调整到合适的宽度。

AutoSizeMode这个属性并不显示在“属性”窗口中。
如果你的DataGridView是动态绑定数据的,

那就只能在代码中设置。
如果你的DataGridView列名是设计好的,那么可以在DataGridView上点击右键,选择“编辑列”,然后选中你要设置自适应的列,在它的属性列表中的“布局”选项卡里面选择AutoSizeMode的类型。


AutoSizeMode属性可以设置的值还有不少:
成员名称 说明 
NotSet  列的大小调整行为从DataGridView.AutoSizeColumnsMode 属性继承。 
None  列宽不会自动调整。 
AllCells  调整列宽,以适合该列中的所有单元格的内容,包括标题单元格。  
AllCellsExceptHeader  调整列宽,以适合该列中的所有单元格的内容,不包括标题单元格。  
DisplayedCells  调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,包括标题单元格。  
DisplayedCellsExceptHeader  调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,不包括标题单元格。  
ColumnHeader  调整列宽,以适合列标题单元格的内容。  
Fill  调整列宽,使所有列的宽度正好填充控件的显示区域,只需要水平滚动保证列宽在DataGridViewColumn.MinimumWidth属性值以上。相对列宽由相对DataGridViewColumn.FillWeight属性值决定。

另外介绍:

DataGridView

有一个属性是AutoSizeColumnMode,他有几个枚举值:
1、AllCells 调整列宽,以适合该列中的所有单元格的内容,包括标题单元格。  
2、AllCellsExceptHeader 调整列宽,以适合该列中的所有单元格的内容,不包括标题单元格。  
3、ColumnHeader 调整列宽,以适合列标题单元格的内容。  
4、DisplayedCells 调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,包括标题单元格。  
5、DisplayedCellsExceptHeader 调整列宽,以适合当前屏幕上显示的行的列中的所有单元格的内容,不包括标题单元格。  
6、Fill 调整列宽,使所有列的宽度正好填充控件的显示区域,只需要水平滚动保证列宽在DataGridViewColumn.MinimumWidth 属性值以上。相对列宽由相对 DataGridViewColumn.FillWeight 属性值决定。  
7、None 列宽不会 自动调整。  
8、NotSet 列的大小调整行为从 DataGridView.AutoSizeColumnsMode 属性继承。

注:如果想要自动设置列宽.在这里就必须把DataGridView的值设置为Fill

     this.dataGridView.DataSource = ds.Tables[0];
     this.dataGridView.Columns[0].FillWeight = 10;      //第一列的相对宽度为10%
     this.dataGridView.Columns[1].FillWeight = 20;      //第二列的相对宽度为20%
     this.dataGridView.Columns[2].FillWeight = 30;      //第三列的相对宽度为30%
     这里的值是相对于DataGridView当前的总宽度的,所以窗体最大化和缩小的效果是不一样的,但比例不变
注:如何给每列设置标头
     设置标题字段(先把ColumnsHeadersVisible设置为true)
     this.dataGridView.Columns[0].HeaderText = "编号";
     this.dataGridView.Columns[1].HeaderText = "日期";
     this.dataGridView.Columns[2].HeaderText = "标题";

分页控件源代码下载