当前位置: 移动技术网 > IT编程>开发语言>.net > DataGridView自动保存列的宽度和位置

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

2019年11月14日  | 移动技术网IT编程  | 我要评论

五月天mp3,康比特左旋肉碱胶囊,顶楼的大象qvod

    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控件,请保留【启用列重新排序】的勾选。

    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列,然后重新进一次程序即可看到效果:

 

 

 

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网