C#将部分Controls数据导入对象并存入ini中

目录

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

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

 3.Ini简易类库编写

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

 5.效果展示

在日常的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));elsefieldInfo.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));}}elsefieldInfo.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);//存入iniIniClass iniClass = new IniClass(Path);iniClass.IniWriteValue("Parm", "trest", str);}

 5.效果展示

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【HTML并不简单】笔记3-你不知道的列表元素和html、body

文章目录 无序列表menuol的其他属性typestart和valuereversed 定义列表dl、dt、ddhtml与body关联性overflow 桌面端和移动端的滚动条 《HTML并不简单&#xff1a;Web前端开发精进秘籍》张鑫旭 笔记 无序列表menu <menu>元素可以看成是<ul>元素的平行替代&#xff…

网源高科产品总监郎磊受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 北京网源高科软件有限公司产品交付部门产品总监、行业解决方案首席咨询顾问郎磊先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“什么样的AI工具&#xff0c;才是项目经理的…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【285-296】

文章目录 285. 为什么需要继承286. 继承原理图287. 继承快速入门288. 289. 290. 291. 292. 继承使用细节1,2,3,4,5288.1 继承给编程带来的便利288.2 继承的深入讨论/细节问题 293. 继承本质详解294. 继承课堂练习1295. 继承课堂练习2296. 继承课堂练习3 285. 为什么需要继承 28…

相亲交友系统的商业模式探讨

在撰写关于相亲交友系统的商业模式探讨时&#xff0c;附带示例代码可能不太合适&#xff0c;因为软文通常是面向非技术读者&#xff0c;讲述商业模式、用户体验等方面的内容。不过&#xff0c;为了满足您的需求&#xff0c;我可以尝试结合一些简单的伪代码&#xff08;模拟代码…

织物缺陷分割系统源码&数据集分享

织物缺陷分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-Faster-EMA&#xff06;yolov8-seg-act等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al lnn…

UE5安卓,多指点击时会调出控制台

参考文章&#xff1a; How to turn off "console window" on swipe (my Lemurs keep opening it!) - Platform & Builds / Mobile - Epic Developer Community Forums (unrealengine.com) 准确来说是4只手指同时在屏幕中按下。这个控制台能像编辑器那样&#xf…

vue项目刷新后h5样式失效

vue项目刷新后h5样式失效 今天遇到一个bug&#xff0c;有一个Element的message组件&#xff0c;用它做的一个进度条&#xff0c;它是写在一个页面上&#xff0c;并且是用js控制dom元素的 web端一切正常&#xff0c;h5如果从别的页面跳过来也正常&#xff0c;但是&#xff0c;H…

IT行业哪些证书可以应对就业难?

作为IT运维专业人士&#xff0c;持续增强自身的专业技能和知识是提升职场竞争力、实现升职加薪的关键途径。 下面为大家搜罗了5本适合IT运维人员考取的证书。 一、ITSS认证 ITSS&#xff0c;即信息技术服务标准&#xff0c;是一套涵盖了IT服务领域的标准库和方法论。 这是我…

Python 卸载所有的包

Python 卸载所有的包 引言正文 引言 可能很少有小伙伴会遇到这个问题&#xff0c;当我们错误安装了一些包后&#xff0c;由于包之间有相互关联&#xff0c;导致一些已经安装的包无法使用&#xff0c;而由于我们已经安装了很多包&#xff0c;它们的名字我们并不完全知道&#x…

在使用yarn下载依赖时会报超时问题,解决贴

在使用yarn下载依赖时会报超时问题&#xff0c;解决贴 这句话表示网络超时 There appears to be trouble with your network connection. Retrying1、我们先使用命令查看使用使用的是国外的镜像。 yarn config list2、然后查看代码 3、更换镜像&#xff0c;设置使用国内镜像…

element ui 使用

文章目录 element ui1.组件内部传值使用说明&#xff1a;当我们在app组件中使用movie组件&#xff0c;我们希望movie组件的内容是由app组件来定义&#xff0c;就可以使用prop关键字1.在app组件中导入movie组件并且使用2.在movie中写死数据测试3.使用date测试4.使用props 2.elem…

Python系统教程005(字符串的格式化输出)

知识回顾 1、默认情况下&#xff0c;input函数接收的数据是字符串类型。 2、字符串类型的关键词是str。 3、\n和\t都是转义字符&#xff0c;\n用来换行&#xff0c;\t用来留出一段固定长度的空白。 4、type函数能够用来查看变量的数据类型 5、数据类型的转换&#xff0c;举…

《Python 安装指南:开启编程之旅》

《Python 安装指南&#xff1a;开启编程之旅》 在当今数字化的时代&#xff0c;编程已经成为一项越来越重要的技能。而 Python 作为一种简洁、高效且功能强大的编程语言&#xff0c;受到了众多开发者的青睐。无论是数据科学、人工智能、Web 开发还是自动化脚本编写&#xff0c…

【JavaEE初阶】深入理解不同锁的意义,synchronized的加锁过程理解以及CAS的原子性实现(面试经典题);

前言 &#x1f31f;&#x1f31f;本期讲解关于锁的相关知识了解&#xff0c;这里涉及到高频面试题哦~~~ &#x1f308;上期博客在这里&#xff1a;【JavaEE初阶】深入理解线程池的概念以及Java标准库提供的方法参数分析-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&am…

cdga|信息差不再是障碍:数据治理新策略

在信息爆炸的时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;其有效管理和利用直接关系到企业的竞争力和创新能力。然而&#xff0c;随着数据量的激增和数据来源的多样化&#xff0c;信息差——即不同部门、团队或个人之间数据理解、获取与利用上的差异&#xff0…

纠删码参数自适应匹配问题ECP-AMP实验方案(二)

6.方法设计 6.1.数据获取 为了收集不同的文件大小和纠删码参数对性能指标的影响&#xff0c;本文在Hadoop平台上进行了模拟实验。Hadoop是一种开源的分布式存储和计算框架&#xff0c;它可以支持不同类型的纠删码&#xff0c;并提供了一些应用程序接口和工具来测试和评估纠删…

美畅物联丨视频汇聚从“设”开始:海康威视摄像机设置详解

在运用畅联云平台进行视频汇聚与监控管理时&#xff0c;海康威视的安防摄像机凭借其卓越的性能与广泛的应用兼容性&#xff0c;成为了众多用户的首选产品。海康威视摄像机参数设置与调试对于实现高效的安防监控至关重要。今天&#xff0c;让我们一同深入学习海康摄像机的参数设…

无人机在矿业领域的应用!

矿区测绘与建模 无人机可以快速、全面地获取矿区的地形地貌数据&#xff0c;生成高精度的二维或三维模型。 这些模型可用于矿区的规划、设计、监测和管理&#xff0c;提高矿山的生产效率。 库存量量化监测 无人机能够捕捉厘米级的地形数据&#xff0c;通过计算得出准确的库…

【星汇极客】STM32 HAL库各种模块开发之DHT11模块

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

查找满足条件的行

有 2022 年 1 月的日销售额统计表如下所示&#xff1a; 找出日销售额大于 1000 的日销售数据&#xff1a; spl("E(?1).select(Sales>1000)",A1:B32) 帮你早下班系列题目合集 免费课程学习、免费软件下载试用