DataGridView保存列宽信息

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
using System.ComponentModel;

namespace System.Windows.Forms
{
    public class HlbDataGridViewW : DataGridView
    {
        private GetOrSetIniKeyValue _inikey;
        /// <summary>
        /// Ini文件操作类
        /// </summary>
        [Browsable(false)]
        public GetOrSetIniKeyValue inikey
        {
            get
            {
                if (_inikey == null)
                {
                    string head = GetBastPatint(this).ToString().Replace(",", "_").Replace(":", "_");
                    _inikey = new GetOrSetIniKeyValue(_IniName, head);
                }
                return _inikey;
            }
            set
            {
                _inikey = value;
            }
        }

        private bool _AutoSaveWidth = true;
        /// <summary>
        /// 是否自动保存宽度信息
        /// </summary>
        [DefaultValue(true)]
        [Description("是否自动保存生成的列信息")]
        public bool AutoSaveWidth
        {
            get { return _AutoSaveWidth; }
            set { _AutoSaveWidth = value; }
        }


        /// <summary>
        /// 获取最父级窗体
        /// </summary>
        /// <param name="ctl">传入一个控件</param>
        public Control GetBastPatint(Control ctl)
        {
            if (ctl.Parent == null) return ctl;
            return GetBastPatint(ctl.Parent);
        }

        private string _IniName = "GridVidewWidth.dll";
        /// <summary>
        /// 保存的配置文件名称
        /// </summary>
        [DefaultValue("GridVidewWidth.dll")]
        [Description("要保存的宽度的配置信息")]
        public string IniName
        {
            get { return _IniName; }
            set
            {
                _IniName = value;
                _inikey = null;
            }
        }


        protected override void OnColumnAdded(DataGridViewColumnEventArgs e)
        {
            if (_AutoSaveWidth)
                GetWidth(e.Column);
            base.OnColumnAdded(e);
        }

        protected override void OnColumnWidthChanged(DataGridViewColumnEventArgs e)
        {
            if (_AutoSaveWidth)
                SetWidth(e.Column.Name, e.Column.Width);
            base.OnColumnWidthChanged(e);
        }
        private void GetWidth(DataGridViewColumn columns)
        {
            int width = 0;
            string value = inikey[columns.Name];
            if (value == "" || value == "0" || !int.TryParse(value, out width) || width == 0) return;
            columns.Width = width;
        }

        private void SetWidth(string name, int width)
        {
            inikey[name] = width.ToString();
        }


    }
    /// <summary>
    /// INI设置文件帮助类
    /// </summary>
    public class GetOrSetIniKeyValue
    {
        public INIFile iniServer;
        string Head;
        public GetOrSetIniKeyValue(string FileName, string head)
        {
            iniServer = new INIFile(FileName);
            iniServer.CreateFile();
            this.Head = head;
        }
        public GetOrSetIniKeyValue(INIFile ini, string head)
        {
            iniServer = ini;
            this.Head = head;
        }
        /// <summary>
        ///读取或设置指定头的值
        /// </summary>
        /// <param name="key">当前对应的键</param>
        /// <returns>指定键的值</returns>
        public string this[string key]
        {
            get { return iniServer.IniReadValue(Head, key); }
            set { iniServer.IniWriteValue(Head, key, value); }
        }
    }

    /// <summary>
    /// INI文件读写类。
    /// HDL
    /// 2009.09.26
    /// </summary>
    public class INIFile
    {
        /// <summary>
        /// 文件路径
        /// </summary>
        public string path;

        /// <summary>
        /// INI文件读写类
        /// </summary>
        /// <param name="INIPath">INI文件路径</param>
        public INIFile(string INIPath)
        {
            path = Path.GetFullPath(INIPath);
        }

        /// <summary>
        /// 文件是否存在
        /// </summary>
        public bool Ispath
        {
            get { return File.Exists(path); }
        }
        /// <summary>
        /// 文件不存在则创建
        /// </summary>
        /// <returns>一个 System.IO.FileStream,它提供对 path 中指定的文件的读/写访问</returns>
        public void CreateFile()
        {
            if (!Ispath)
            {
                try
                {
                    using (File.Create(path)) { }
                }
                catch { }
            }
        }

        private int _SizeWord = 1000;
        /// <summary>
        /// 读取或设置字节大小,默认是255字节
        /// </summary>
        public int SizeWord
        {
            get { return _SizeWord; }
            set
            {
                if (value > 1)
                    _SizeWord = value;
            }
        }

        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);

        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);


        /// <summary>
        /// 写INI文件
        /// </summary>
        /// <param name="Section"></param>
        /// <param name="Key"></param>
        /// <param name="Value"></param>
        public void IniWriteValue(string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, this.path);
        }

        /// <summary>
        /// 读取INI文件
        /// </summary>
        /// <param name="Section"></param>
        /// <param name="Key"></param>
        /// <returns></returns>
        public string IniReadValue(string Section, string Key)
        {
            StringBuilder temp = new StringBuilder(_SizeWord);
            int j = GetPrivateProfileString(Section, Key, "", temp, _SizeWord, this.path);
            return temp.ToString();
        }

        public byte[] IniReadValues(string section, string key)
        {
            byte[] temp = new byte[_SizeWord];
            int i = GetPrivateProfileString(section, key, "", temp, _SizeWord, this.path);
            return temp;

        }
        public List<string> ReadKeys(string sectionName)
        {
            byte[] buffer = new byte[5120];
            int rel = GetPrivateProfileString(sectionName, null, "", buffer, buffer.GetUpperBound(0), this.path);
            int iCnt, iPos;
            List<string> arrayList = new List<string>();
            string tmp;
            if (rel > 0)
            {
                iCnt = 0; iPos = 0;
                for (iCnt = 0; iCnt < rel; iCnt++)
                {
                    if (buffer[iCnt] == 0x00)
                    {
                        tmp = System.Text.ASCIIEncoding.Default.GetString(buffer, iPos, iCnt - iPos).Trim();
                        iPos = iCnt + 1;
                        if (tmp != "")
                            arrayList.Add(tmp);
                    }
                }
            }
            return arrayList;
        }
        /// <summary>
        /// 删除ini文件下所有段落
        /// </summary>
        public void ClearAllSection()
        {
            IniWriteValue(null, null, null);
        }
        /// <summary>
        /// 删除ini文件下personal段落下的所有键
        /// </summary>
        /// <param name="Section"></param>
        public void ClearSection(string Section)
        {
            IniWriteValue(Section, null, null);
        }
    }
}

下载源码
原文地址:https://www.cnblogs.com/hdl217/p/1990657.html