首页 > 编程语言 >C# DataGridView自动保存列的宽度和位置

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

时间:2025-01-15 13:54:52浏览次数:1  
标签:gt C# DataGridView dgvTarget lt 宽度 ------------- Columns

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 = "来源单号";
                #endregion
                DataGridViewColumnStyle 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|

标签:gt,C#,DataGridView,dgvTarget,lt,宽度,-------------,Columns
From: https://www.cnblogs.com/ralphlauren/p/18621180

相关文章

  • CSS text effects
    1.溢出<!DOCTYPEhtml><html><head><style>p.test1{white-space:nowrap;width:200px;border:1pxsolid#000000;overflow:hidden;text-overflow:clip;}p.test2{white-space:nowrap;width:200px;border:......
  • [数据结构学习笔记13] 递归简介(Recursion)
    递归让我们把问题由大分小,小到我们能够轻松处理。递归方法有两个要注意的点:1.递归方法会重复的被调用;2.必须有一个终止条件,否则方法调用不停,会导致stackoverflow。看下面的一个例子,这个没有终止条件,会报错!functionhello(){console.log("I'malittlefunction,shorta......
  • 【PCIE734-1 】基于 PCIe 总线架构的 XCKU060 FPGA 4 路 SFP+光纤通道处理平台
    产品概述PCIE734-1 是一款基于 PCIE 总线架构的 KintexUltraScale 系列 XCKU060FPGA 高性能 4 路 SFP+光纤数据处理平台。该平台具有 1 个 PCIeGen3x8 主机接口、4 个 SFP+10G 光纤接口,可以实现 4 路 SFP+10G 光纤的数据实时采集、处理、传输。板 卡......
  • MAC层接收逻辑处理及CRC校验接收数据
    前言在上一章节中,笔者就以太网的CRC计算规则做了简单介绍,并对实现流程进行了讲解,以及代码仿真验证,在本节中,笔者将就以太网MAC层的接收代码做逻辑实现,并且做CRC计算,只有当板卡计算得到的CRC计算结果,与接收数据中的CRC校验结果一致,才认为本帧数据可靠,进行进一步接收利用,并且......
  • CF div2 990(A~E)
    VP赛时\(4\)题,发挥得比较不错的一场,并且这场也偏简单。A数数题,找好规律直接模拟即可codeB简单排列组合题显然总方案数为:\[n!/(a_1!*a_2!*...*a_m!)\]\(a_1到a_m\)表示某种字符的数量想最小化总方案数,只能最大化上式分母的值。而题目操作等价于将某个\(a_i\)减......
  • c++&& SDK打包过程
     在C++中,SDK(SoftwareDevelopmentKit)打包工具的选择和使用通常取决于您的具体需求和目标平台。以下是一个详细的步骤描述,用于创建和打包一个C++SDK。这里我们假设您已经有一个C++项目需要打包为SDK。步骤一:准备你的C++项目项目结构规划:确定你的SDK包含哪些功能,比如源代......
  • Effective C++ 之【条款7:为多态基类声明virtual析构函数】
    文章目录Tips1Tips2一、为什么要有virtual析构函数?二、为什么有时候不要声明虚构函数?三、使用一下纯虚函数。TodayThinking~Tips1polymorphic(带有多态性质的)baseclasses应该声明一个virtual的虚构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构......
  • (ACL-2024)MELoRA:用于参数高效微调的迷你集成低秩适配器
    MELoRA:用于参数高效微调的迷你集成低秩适配器paper是山东大学发表在ACL2024的工作papertitle:MELoRA:Mini-EnsembleLow-RankAdaptersforParameter-EfficientFine-TuningCode:https://github.com/chasonshi/meloraAbstract参数高效微调(PEFT)是一种流行的......
  • (ICLR-2024)VERA:基于向量的随机矩阵自适应
    VERA:基于向量的随机矩阵自适应paper是阿姆斯特丹大学发表在ICLR2024的工作papertitle:VERA:VECTOR-BASEDRANDOMMATRIXADAPTATIONABSTRACT低秩自适应(LoRA)是一种流行的方法,可在微调大型语言模型时减少可训练参数的数量,但在扩展到更大的模型或部署大量按用户......
  • gesp(C++五级)(5)洛谷:B3929:[GESP202312 五级] 小杨的幸运数
    gesp(C++五级)(5)洛谷:B3929:[GESP202312五级]小杨的幸运数题目描述小杨认为,所有大于等于aaa的完全平方数都是他的超级幸运数。小杨还认为,所有超级幸运数的倍数都是他......