• 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);
            }
        }
    }
    

    下载源码
  • 相关阅读:
    运维:生产日志重复打印了,赶紧来看看~
    就这样,我走过了程序员的前五年。一路风雨泥泞,前方阳光正好。
    一个排序引发的BUG
    曝光一个网站,我周末就耗在上面了。
    我不服!这开源项目居然才888个星!?
    知乎的一次29.7元的咨询
    面试官:啥是请求重放呀?
    414天前,我以为这是编程玄学...
    老爷子这代码,看跪了!
    面试官一个线程池问题把我问懵逼了。
  • 原文地址:https://www.cnblogs.com/hdl217/p/1990657.html
Copyright © 2020-2023  润新知