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控件,请保留【启用列重新排序】的勾选。
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列,然后重新进一次程序即可看到效果:
好了,分享就到此结束了,希望对有此需要的人有一些帮助。