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

news/2025/1/15 13:48:28/文章来源:https://www.cnblogs.com/ralphlauren/p/18621180

C# DataGridView自动保存列的宽度和位置| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission |

| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------| -------------|
| 14173350| C# DataGridView自动保存列的宽度和位置| 2020-12-22T15:30:00| | BlogPost|

   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);}}
}</pre>
复制代码

    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 = "来源单号";#endregionDataGridViewColumnStyle style = new DataGridViewColumnStyle(dataGridView1);}catch (Exception ex){MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}}
复制代码

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

 

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

| 648658| | 2024-04-29T21:15:00| false| | 2020-12-22T15:29:54.02| true| WinForm程序中表单的自动保存列的宽度和位置,是一种常见的功能,对于用户体验来说是非常好的。现记录一下实现过程: 1、新建一个类,命为为:DataGridViewColumnStyle。 这个类实现的功能:当DataGridView的列宽或列的位置发生改变时,系统将自动记录DataGridVie| Anonymous|

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/869577.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年——29款顶级项目管理工具,提升工作效率必备!

在2025年的数字化时代,项目管理已成为企业成功不可或缺的一环。随着技术的飞速发展,各种项目管理工具应运而生,旨在帮助团队更高效、更准确地完成任务。今天,我们将为大家介绍30款顶级项目管理工具,这些工具不仅涵盖了从任务分配到资源管理的各个方面,还能通过智能化手段…

【PCIE734-1 】基于 PCIe 总线架构的 XCKU060 FPGA 4 路 SFP+光纤通道处理平台

产品概述 PCIE734-1 是一款基于 PCIE 总线架构的 Kintex UltraScale 系列 XCKU060 FPGA 高性能 4 路 SFP+光纤数据处理平台。该平台具有 1 个 PCIe Gen3 x8 主机接口、4 个 SFP+ 10G 光纤接口,可以实现 4 路 SFP+ 10G 光纤的数据实时采集、处理、传输。板 卡 采 用 Xilinx 的 …

封装按钮信息与按钮数量动态显示与提示信息并进行触发按钮组件

标题: 封装弹框并点击动态按钮组件进行触发功能: 封装按钮信息与按钮数量动态显示组件页面: 按钮信息与按钮数量动态显示,提示信息不固定封装组件页面: <template> <el-dialog v-model="dialogVisible" class="stepCustom-dialog custom-dialog…

图表封装组件

图表封装: 图表封装使用:<template> <!--软件模块复用率图表--> <chart-and-table ref="chartAndTableRef" :chart-desc="chartDesc" :chart-loading="chartLoading" :columns="columns" :list=&qu…

vue3+ts展示条项字段

展示条项组件:<el-form v-if="currentStep === 4" label-position="left" label-width="120px" style="display: flex;flex-wrap: wrap;justify-content: flex-start;margin-left: 138px;"> <el-row v-for="(ro…

elasticsearch的RestAPI之操作文档

RestClient操作文档 新增文档 将DB表中的数据同步到elasticsearch 1)查询数据库 1.1)数据库查询后的结果是一个Hotel类型的对象1 @Data2 @TableName("tb_hotel")3 public class Hotel {4 @TableId(type = IdType.INPUT)5 private Long id;6 private St…

【VPX303】基于 3U VPX 总线架构的双银河飞腾 FT-M6678 DSP 信号处理平台(100%全国产化)

​产品概述 VPX303 是一款基于 3U VPX 总线架构的高性能信号处理板,板载 2 片国防科大银河飞腾 FT-M6678 多核浮点运算 DSP,可以实现各种实时性要求较高的信号处理算法。板卡每个 DSP 均支持 5 片 DDR3 SDRAM 实现数据缓存,两片DSP 之间通过 X4 SRIO 进行互联。每个 DSP 均引…

第七章 中断

本文是对《操作系统真象还原》第七章学习的笔记,欢迎大家一起交流。第七章 中断 本文是对《操作系统真象还原》第七章学习的笔记,欢迎大家一起交流。 a 启用中断 本节的主要任务是打开中断,并且使用时钟中断测试 知识部分 中断分类 中断可以分为外部中断和内部中断,这已经是…

PHP语法进阶

PHP语法进阶 数组 数组能够在单个变量中存储多个值,并且可以根据 键 访问其中的 值PHP有两种数组:数值数组、关联数组。 数值和关联两个词都是针对数组的键而言的。 先介绍下数值数组,数值数组是指数组的键是整数的数组,并且键的整数顺序是从0开始,依次类推。 数值数组 $m…

Agentic RAG 系统的崛起

探秘智能检索新境界:Agentic RAG 系统的崛起 📖阅读时长:10分钟 🕙发布时间:202探秘智能检索新境界:Agentic RAG 系统的崛起 📖阅读时长:10分钟 🕙发布时间:2025-01-15近日热文:全网最全的神经网络数学原理(代码和公式)直观解释 欢迎关注知乎和公众号的专栏内…