C#将部分Controls数据导入对象并存入ini中的操作方法

 更新时间:2024年10月09日 12:35:23   作者:薄荷撞~可乐  
在Winform设计中,经常需要将控件数据导出到属性或字段中,本文详细介绍了如何优化这一过程,包括控件和属性的遍历,以及使用FieldInfo的getSet函数和Ini类库来实现数据的有效存储和转换,感兴趣的朋友跟随小编一起看看吧

在日常的Winform设计工作中,将控件中的数据导出到对应属性或者字段中,再进行保存是经常会用到的技巧;最简单的就是同时遍历控件和遍历属性字段进行名称对比(需要保证控件的名称要包含在字段属性中);

本篇文章主要是在简单的基础上优化整体逻辑,不仅仅是只遍历控件和属性进行名称对比(适合类),还包含一些筛选;

1.遍历控件和属性得到控件的值

 在下面代码中,控件命名是以textBox_one的形式命名的

///类对象
class ObjectParm
    {
        public int one;
        public string two;
        public int three;
        public string four;
        public int five;
        public string six;
    }
private void Save(ObjectParm objectParm, Control controls, string TextName = "textBox_", string ComboBoxName = "comboBox_")
        {
            Type type = objectParm.GetType();
            //获取有关成员属性的信息以及提供对成员数据的访问
            MemberInfo[] memberInfos = type.GetMembers();//获取所有公共成员
            foreach (Control control in controls.Controls)
            {
                foreach (MemberInfo item in memberInfos)
                {
                    //这里字段属性均可以
                    if (item.MemberType == MemberTypes.Field)
                    {
                        if (control is ComboBox)
                        {
                            if (control.Name == ComboBoxName + item.Name)
                            {
                                string value = control.Text;
                                //需要筛选对象属性的类型
                                SetMemberValue(objectParm, item.Name, value);
//---------------------------------注意----------------------------------
//SetMemberValue函数是判断属性或者字段的类型,根据类型进行不同的赋值
                            }
                        }
                        else if (control is TextBox)
                        {
                            if (control.Name == TextName + item.Name)
                            {
                                string value = control.Text;
                                //需要筛选对象属性的类型
                                SetMemberValue(objectParm,item.Name,value);
                            }
                        }
                    }
                }
            }
        }

 2.利用FieldInfo的getSet函数设置类对象数据

/// <summary>
        /// 设置类对象成员数据
        /// </summary>
        /// <param name="objectParm"></param>
        /// <param name="fileName"></param>
        /// <param name="filevalue"></param>
//Istype函数是对比类型是否一致
        private bool SetMemberValue(ObjectParm objectParm, string fileName, string filevalue)
        {
            Type type = objectParm.GetType();
            //发现字段属性并提供访问
            FieldInfo fieldInfo = type.GetField(fileName);//搜索字段
            bool ConverFlag = true;
            //类型匹配
            if (Istype(fieldInfo.FieldType, "System.String"))
            {
                fieldInfo.SetValue(objectParm, filevalue);
            }
            if (Istype(fieldInfo.FieldType, "System.Double"))
            {
                //判断是否可以进行转
                double result = 0;
                if (!double.TryParse(filevalue, out result)) ConverFlag = false;
                fieldInfo.SetValue(objectParm, result);
            }
            if (Istype(fieldInfo.FieldType, "System.Single"))
            {
                float result = 0;
                if (!float.TryParse(fileName, out result))
                    ConverFlag = false;
                fieldInfo.SetValue(objectParm, result);
            }
            if (Istype(fieldInfo.FieldType, "System.Boolean"))
            {
                bool flag = false;
                if (!Boolean.TryParse(fileName, out flag))
                    ConverFlag = false;
                fieldInfo.SetValue(objectParm, flag);
            }
            if (Istype(fieldInfo.FieldType, "System.UInt32"))
            {
                uint value = 0;
                if (!uint.TryParse(fileName, out value))
                    ConverFlag = false;
                fieldInfo.SetValue(objectParm, value);
            }
            if (Istype(fieldInfo.FieldType, "System.UInt16"))
            {
                UInt16 value = 0;
                if (!UInt16.TryParse(fileName, out value))
                    ConverFlag = false;
                fieldInfo.SetValue(objectParm, value);
            }
            if (Istype(fieldInfo.FieldType, "System.Int32"))
            {
                int value = 0;
                if (!Int32.TryParse(fileName, out value))
                    ConverFlag = false;
                fieldInfo.SetValue(objectParm, value);
            }
            if (Istype(fieldInfo.FieldType, "System.Decimal"))
            {
                if (filevalue != "")
                    fieldInfo.SetValue(objectParm, Decimal.Parse(filevalue));
                else
                    fieldInfo.SetValue(objectParm, new Decimal(0));
            }
            if (Istype(fieldInfo.FieldType, "System.Nullable`1[System.DateTime]"))
            {
                if (filevalue != "")
                {
                    try
                    {
                        fieldInfo.SetValue(objectParm, (DateTime?)DateTime.ParseExact(filevalue, "yyyy-MM-dd HH:mm:ss", null));
                    }
                    catch
                    {
                        fieldInfo.SetValue(objectParm, (DateTime?)DateTime.ParseExact(filevalue, "yyyy-MM-dd", null));
                    }
                }
                else
                    fieldInfo.SetValue(objectParm, null);
            }
            return ConverFlag;
        }
private bool Istype(Type type, string typeName)
        {
            if (type.ToString() == typeName)
            { return true; }
            if (type.ToString() == "System.Object")
                return false;
            return Istype(type.BaseType, typeName);
        }

 3.Ini简易类库编写

class IniClass
    {
        public static string inipath = Directory.GetCurrentDirectory() + "\\" + "systemset.ini";//这个地方实际没用到,在另外一个地方
        [System.Runtime.InteropServices.DllImport("kernel32")]
        public static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        [System.Runtime.InteropServices.DllImport("kernel32")]
        public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        public IniClass(string inipath_)
        {
            inipath = inipath_;
        }
        /// ﹤summary﹥   /// 写入INI文件   /// ﹤/summary﹥   /
        // ﹤param name="Section"﹥项目名称(如 [TypeName] )﹤/param﹥   
        /// ﹤param name="Key"﹥键﹤/param﹥   
        /// ﹤param name="Value"﹥值﹤/param﹥   
        public void IniWriteValue(string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, inipath);
        }
        /// ﹤summary﹥   
        /// 读出INI文件   
        /// ﹤/summary﹥   
        /// ﹤param name="Section"﹥项目名称(如 [TypeName] )﹤/param﹥   
        /// ﹤param name="Key"﹥键﹤/param﹥   
        public string IniReadValue(string Section, string Key, string default_value = "")
        {
            StringBuilder temp = new StringBuilder(50000);
            int i = GetPrivateProfileString(Section, Key, default_value, temp, 50000, inipath);
            return temp.ToString();
        }

 4.存入对象转换为json存入ini

string Path = @"E:\ymx\Test\将部分Controls数据导入对象\sys.ini";
        private void button1_Click(object sender, EventArgs e)
        {
            Save(objectParm,panel1, "textBox_", "comboBox_");
            string str = JsonConvert.SerializeObject(objectParm);
            //存入ini
            IniClass iniClass = new IniClass(Path);
            iniClass.IniWriteValue("Parm", "trest", str);
         }

 5.效果展示

到此这篇关于C#将部分Controls数据导入对象并存入ini中的文章就介绍到这了,更多相关C#Controls数据存入ini中内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现贪吃蛇小游戏

    C#实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了C#实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • c# 判断是否为空然后赋值的4种实现方法

    c# 判断是否为空然后赋值的4种实现方法

    下面小编就为大家分享一篇c# 判断是否为空然后赋值的4种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C# DataSet查看返回结果集的实现

    C# DataSet查看返回结果集的实现

    这篇文章主要介绍了C# DataSet查看返回结果集的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • C#中简单的装箱操作实例分析

    C#中简单的装箱操作实例分析

    这篇文章主要介绍了C#中简单的装箱操作,实例分析了C#中装箱操作的概念、用法与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C#实现加密的几种方法介绍

    C#实现加密的几种方法介绍

    这篇文章介绍了C#实现加密的几种方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 不安装excel使用c#创建excel文件

    不安装excel使用c#创建excel文件

    这篇文章主要介绍了使用c#创建excel的示例,刚时给出了不安装excel也可创建excel的方法,需要的朋友可以参考下
    2014-02-02
  • C#对Word文档的创建、插入表格、设置样式等操作实例

    C#对Word文档的创建、插入表格、设置样式等操作实例

    今天小编就为大家分享一篇C#对Word文档的创建、插入表格、设置样式等操作实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • C#中读写INI配置文件的方法

    C#中读写INI配置文件的方法

    这篇文章主要介绍了C#中读写INI配置文件的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • 人脸认证源码faceIdentify详解

    人脸认证源码faceIdentify详解

    这篇文章主要为大家详细介绍了人脸认证源码faceIdentify的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • C#通过接口与线程通信(捕获线程状态)示例代码

    C#通过接口与线程通信(捕获线程状态)示例代码

    本文介绍C#通过接口与线程通信(捕获线程状态),并提供简单的示例代码供参考
    2013-12-12

最新评论