欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

DataGridView自动保存列的宽度和位置

程序员文章站 2022-10-28 10:34:38
WinForm程序中表单的自动保存列的宽度和位置,是一种常见的功能,对于用户体验来说是非常好的。现记录一下实现过程: 1、新建一个类,命为为:DataGridViewColumnStyle。 这个类实现的功能:当DataGridView的列宽或列的位置发生改变时,系统将自动记录DataGridVie ......

    winform程序中表单的自动保存列的宽度和位置,是一种常见的功能,对于用户体验来说是非常好的。现记录一下实现过程:

    1、新建一个类,命为为:datagridviewcolumnstyle。

    这个类实现的功能:当datagridview的列宽或列的位置发生改变时,系统将自动记录datagridview的设置。当用户下次打开此窗体的时候,表单的样式是他上次设置的模样。代码如下:

    class datagridviewcolumnstyle
    {
        private datagridview dgvtarget = null;                              //待处理的datagridview对象
        private string path;                                                //文件路径
        private datatable dtcolumnstyle = null;                             //列样式数据表
        private bool isbindcolumnstyle = false;                             //是否绑定列样式否

        //datagridview属性
        public datagridview datagridview
        {
            get { return dgvtarget; }
            set
            {
                //去除事件
                if (dgvtarget != null)
                {
                    dgvtarget.columnwidthchanged -= new datagridviewcolumneventhandler(datagridview_columnwidthchanged);
                    dgvtarget.columndisplayindexchanged -= new datagridviewcolumneventhandler(datagridview_columndisplayindexchanged);
                }
                dgvtarget = value;
                //注册事件
                if (dgvtarget != null)
                {
                    dgvtarget.columnwidthchanged += new datagridviewcolumneventhandler(datagridview_columnwidthchanged);
                    dgvtarget.columndisplayindexchanged += new datagridviewcolumneventhandler(datagridview_columndisplayindexchanged);
                }
            }
        }

        //无参构造函数
        public datagridviewcolumnstyle()
        {
        }

        //有参构造函数
        public datagridviewcolumnstyle(datagridview datagridview) : this()
        {
            datagridview = datagridview;
            //文件名
            string formname = dgvtarget.findform().name;
            string userid = "test";
            path = application.startuppath + @"\accounts\" + userid + "\\" + formname + "_" + dgvtarget.name + ".xml";
            //列样式数据表
            dtcolumnstyle = new datatable();
            dtcolumnstyle.tablename = dgvtarget.name;     //表名
            dtcolumnstyle.columns.add("name");            //列名
            dtcolumnstyle.columns.add("width");           //列宽度
            dtcolumnstyle.columns.add("displayindex");    //显示顺序
            //绑定列样式
            bindcolumnstyle();
        }

        /// <summary>
        /// 绑定列样式
        /// </summary>
        private void bindcolumnstyle()
        {
            try
            {
                //赋初始值
                isbindcolumnstyle = true;

                //如果不存在则保存列样式
                if (!file.exists(path))
                {
                    savecolumnstyle();
                }

                //加载列样式
                dtcolumnstyle.readxml(path);

                foreach (datarow row in dtcolumnstyle.rows)
                {
                    if (dgvtarget.columns.contains(row["name"].tostring().trim()) && dgvtarget.columns[row["name"].tostring().trim()].visible == true)
                    {
                        dgvtarget.columns[row["name"].tostring().trim()].width = int.parse(row["width"].tostring().trim());
                        dgvtarget.columns[row["name"].tostring().trim()].displayindex = int.parse(row["displayindex"].tostring().trim());
                    }
                }
            }
            catch (exception ex)
            {
                deletecolumnstyle();
                messagebox.show(ex.message, "提示", messageboxbuttons.ok, messageboxicon.information);
            }
            finally
            {
                isbindcolumnstyle = false;
            }
        }

        /// <summary>
        /// 列显示位置改变时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void datagridview_columndisplayindexchanged(object sender, datagridviewcolumneventargs e)
        {
            if (isbindcolumnstyle == false)
            {
                savecolumnstyle();
            }
        }

        /// <summary>
        /// 列宽度改变时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void datagridview_columnwidthchanged(object sender, datagridviewcolumneventargs e)
        {
            if (isbindcolumnstyle == false)
            {
                savecolumnstyle();
            }
        }

        /// <summary>
        /// 保存列样式
        /// </summary>
        private void savecolumnstyle()
        {
            try
            {
                //如果目录不存在则创建
                string dir = path.substring(0, path.lastindexof('\\'));
                if (!directory.exists(dir))
                {
                    directory.createdirectory(dir);
                }
                //读取列样式
                string[] columnstyle = new string[dgvtarget.columns.count];
                foreach (datagridviewcolumn col in dgvtarget.columns)
                {
                    if (col.visible == true)
                    {
                        columnstyle[col.displayindex] = col.name + '|' + col.width + '|' + col.displayindex;
                    }
                }
                int colscount = columnstyle.length;
                //保存列样式
                dtcolumnstyle.rows.clear();
                for (int i = 0; i < colscount; i++)
                {
                    string[] str = new string[3];
                    try
                    {
                        datarow newrow = dtcolumnstyle.newrow();
                        str = columnstyle.getvalue(i).tostring().split('|');
                        newrow["name"] = str[0];
                        newrow["width"] = str[1];
                        newrow["displayindex"] = str[2];
                        dtcolumnstyle.rows.add(newrow);
                    }
                    catch
                    {
                        continue;
                    }
                }
                dtcolumnstyle.writexml(path);
            }
            catch (exception ex)
            {
                messagebox.show(ex.message, "提示", messageboxbuttons.ok, messageboxicon.information);
            }
        }

        /// <summary>
        /// 删除列样式
        /// </summary>
        private void deletecolumnstyle()
        {
            try
            {
                if (file.exists(path))
                {
                    file.delete(path);
                }
            }
            catch (exception ex)
            {
                messagebox.show(ex.message, "提示", messageboxbuttons.ok, messageboxicon.information);
            }
        }
    }

    2、以上这些,已经实现了全部的功能。下面开始建一个winform程序来测试结果,为方便测试将datagridview的数据源由xml文件读取。

          从sql server数据库随便找张数据表生成xml,文件保存为test.xml。(请将test.xml文件拷贝到debug文件夹下面)

select top 10 mo_no,mrp_no,qty,bil_no 
from mf_mo 
where mo_dd='2019-11-07' 
order by mo_no 
for xml path ('category'),type,root('documentelement')

    3、新建一个winform程序,命名为main,并拖入一个datagridview控件,请保留【启用列重新排序】的勾选。

DataGridView自动保存列的宽度和位置

    main_load方法如下:

        private void main_load(object sender, eventargs e)
        {
            try
            {
                //xml文件路径
                string path = @"test.xml";
                //读取文件
                dataset ds = new dataset();
                if (file.exists(path))
                {
                    ds.readxml(path);
                }
                datagridview1.datasource = ds.tables.count > 0 ? ds.tables[0] : null;
                //加工datagridview1
                #region 加列标题测试
                datagridview1.columns[0].headertext = "制令单号";
                datagridview1.columns[1].headertext = "成品编号";
                datagridview1.columns[2].headertext = "生产数量";
                datagridview1.columns[3].headertext = "来源单号";
                #endregion
                datagridviewcolumnstyle style = new datagridviewcolumnstyle(datagridview1);
            }
            catch (exception ex)
            {
                messagebox.show(ex.message, "提示", messageboxbuttons.ok, messageboxicon.information);
            }
        }

    4、执行程序,随意拖动或拉宽datagridview列,然后重新进一次程序即可看到效果:

 

 DataGridView自动保存列的宽度和位置

 

     好了,分享就到此结束了,希望对有此需要的人有一些帮助。