当前位置: 首页 > article >正文

C# WinForm 系统参数设置功能完整实现

在工业上位机、客户端工具开发中系统参数配置是必备基础功能。本文用一套完整可运行的代码带你实现 WinForm INI 配置文件的参数设置自动生成配置、读取加载、界面编辑、保存生效全程逻辑清晰、注释详细可直接落地项目。一、功能说明本案例实现一套标准的系统参数设置流程程序目录自动生成sysInfo.ini配置文件主窗体加载时自动读取配置点击按钮弹出参数设置窗口下拉框绑定枚举、文本框加载配置修改后写入配置文件重启 / 重新加载生效适用场景PLC 通信参数、系统自启、屏保 / 注销时间、设备参数等配置管理。二、核心准备1. 基础信息开发框架.NET Framework 4.5技术WinForm、INI 文件读写、窗体传参、枚举绑定关键类SysInfo参数实体、InfoService配置读写服务2. 系统参数实体类 SysInfo所有配置项统一用实体承载字符串类型必须给默认值否则不会写入 INI 文件。/// summary /// 系统参数实体 /// /summary public class SysInfo { // CPU 类型枚举 public xbd.s7netplus.CpuType CpuType { get; set; } // IP 地址【必须给默认值否则不生成节点】 public string IPAddress { get; set; } 127.0.0.1; // 机架号 public short Rack { get; set; } // 槽号 public short Slot { get; set; } // 开机自启 public bool AutoStart { get; set; } // 屏保时间 public int ScreenTime { get; set; } // 注销时间 public int LogoffTime { get; set; } }三、主窗体逻辑FrmMain1. 定义配置路径与全局对象public partial class FrmMain : Form { // 配置文件路径程序启动目录 private string sysInfoPath Application.StartupPath \\sysInfo.ini; // 全局系统参数 private SysInfo sysInfo; // 配置读写服务 private InfoService infoService new InfoService(); public FrmMain() { InitializeComponent(); } }2. 窗体加载 → 读取配置程序启动时自动读取文件不存在 / 格式错误则提示。private void FrmMain_Load(object sender, EventArgs e) { // 从 INI 读取系统配置 this.sysInfo infoService.GetSysInfoFromPath(sysInfoPath); // 读取失败 if (this.sysInfo null) { new FrmMsgNoAck(系统配置读取失败请检查 sysInfo.ini 是否存在, 系统配置) .ShowDialog(); return; } }3. 打开参数设置弹窗按钮命名btn_ParamSet点击弹出参数设置窗口并传递当前配置。private void btn_ParamSet_Click(object sender, EventArgs e) { // 传参参数实体、读写服务、配置路径 new FrmParamSet(this.sysInfo, this.infoService, this.sysInfoPath) .ShowDialog(); }四、参数设置窗体FrmParamSet1. 窗体构造函数接收参数public partial class FrmParamSet : Form { public SysInfo SysInfo { get; set; } public InfoService InfoService { get; set; } public string SysInfoPath { get; set; } /// summary /// 构造传参 /// /summary public FrmParamSet(SysInfo sysInfo, InfoService infoService, string sysInfoPath) { InitializeComponent(); this.SysInfo sysInfo; this.InfoService infoService; this.SysInfoPath sysInfoPath; } }2. 窗体加载 → 初始化与赋值枚举绑定下拉框读取已有配置并显示到界面private void FrmParamSet_Load(object sender, EventArgs e) { // 1. 绑定 CPU 类型枚举 this.cmb_CPUType.DataSource Enum.GetNames(typeof(xbd.s7netplus.CpuType)); // 2. 有配置则加载到界面 if (SysInfo ! null) { this.cmb_CPUType.SelectedItem SysInfo.CpuType.ToString(); this.txt_IPAddress.Text SysInfo.IPAddress; this.txt_Rack.Text SysInfo.Rack.ToString(); this.txt_Slot.Text SysInfo.Slot.ToString(); this.toggle_AutoStart.Checked SysInfo.AutoStart; this.txt_ScreenTime.Text SysInfo.ScreenTime.ToString(); thistxt_LogoffTime.Text SysInfo.LogoffTime.ToString(); } }3. 保存参数 → 写入 INI 文件按钮命名btn_PLCSet完成取值→转换→写入三步。private void btn_PLCSet_Click(object sender, EventArgs e) { try { // 为空则新建实体 if (this.SysInfo null) this.SysInfo new SysInfo(); // 界面值赋值给实体 this.SysInfo.IPAddress this.txt_IPAddress.Text.Trim(); this.SysInfo.CpuType (CpuType)Enum.Parse(typeof(CpuType), this.cmb_CPUType.Text.Trim(), true); this.SysInfo.Rack Convert.ToInt16(this.txt_Rack.Text.Trim()); this.SysInfo.Slot Convert.ToInt16(this.txt_Slot.Text.Trim()); this.SysInfo.AutoStart this.toggle_AutoStart.Checked; this.SysInfo.ScreenTime Convert.ToInt32(this.txt_ScreenTime.Text.Trim()); this.SysInfo.LogoffTime Convert.ToInt32(this.txt_LogoffTime.Text.Trim()); // 写入配置文件 bool result this.InfoService.SetSysInfoFromPath(this.SysInfo, this.SysInfoPath); if (result) { MessageBox.Show(参数保存成功, 提示); this.DialogResult DialogResult.OK; this.Close(); } else { new FrmMsgNoAck(参数写入失败, 通信参数).ShowDialog(); } } catch (Exception ex) { MessageBox.Show($保存失败{ex.Message}, 错误); } }五、关键问题解析必看1. 为什么 IP 地址不生成 / 不显示原因string类型默认为null不会写入 INI 文件。解决给属性设置默认值。public string IPAddress { get; set; } 127.0.0.1;2. 配置文件自动生成首次调用SetSysInfoFromPath时文件不存在会自动创建无需手动新建。3. 类型转换要点枚举 ↔ 字符串Enum.Parse数值类型Convert.ToInt16/ToInt32必须加try-catch防止输入非法值崩溃六、完整执行流程启动程序 → 加载FrmMain→ 读取sysInfo.ini无文件 → 自动生成读取失败 → 提示点击参数设置→ 弹窗加载当前配置修改参数 → 点击保存 → 写入 INI重启 / 重新加载 → 新配置生效

相关文章:

C# WinForm 系统参数设置功能完整实现

在工业上位机、客户端工具开发中,系统参数配置是必备基础功能。本文用一套完整可运行的代码,带你实现 WinForm INI 配置文件的参数设置:自动生成配置、读取加载、界面编辑、保存生效,全程逻辑清晰、注释详细,可直接落…...

Three.js模型加载太慢?试试这个gltf-pipeline压缩技巧,亲测有效!

Three.js模型加载优化实战:gltf-pipeline压缩技巧详解 在Web 3D开发中,Three.js无疑是构建沉浸式体验的首选工具之一。然而,随着3D模型复杂度的提升,文件体积膨胀导致的加载延迟成为开发者面临的普遍挑战。想象一下,用…...

全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?

早些时候,聊过 Python 领域那场惊心动魄的供应链攻击。当时我就感叹,虽然我们 JavaScript 开发者对这类套路烂熟于心,但亲眼目睹这种规模的“投毒”还是头一次。然而,属于我们 JS 圈的至暗时刻,终究还是卷土重来了。而…...

16.为什么 Fragment 相比额外包一层 div 更优?

在 React 里&#xff0c;只要你写过几行组件&#xff0c;很容易掉进一个老毛病&#xff1a;“反正组件要有一个根节点&#xff0c;那我就随手包一层 <div> 吧。”一开始看不出问题&#xff0c;但项目一大&#xff0c;你会发现&#xff1a;DOM 结构被一堆没意义的 <div…...

17.在 React 中如何根据条件决定渲染哪个组件?

在 React 里&#xff0c;组件不是一上来就“全给你渲染出来”的。 很多时候&#xff0c;我们希望&#xff1a;界面要看情况说话——登录了看“欢迎回来”没登录就看“请先登录”加载中只给你个转圈圈请求失败再丢个错误提示这些“根据条件&#xff0c;决定渲染什么”的行为&…...

18.children 这个 props 的意义何在?该怎样正确使用?

在 React 里&#xff0c;children 是一个非常特殊、非常常用的 prop&#xff0c; 它专门用来接收&#xff1a;写在组件标签中间的那一部分内容。你可以把它理解为&#xff1a;组件外层负责搭“外壳”&#xff0c;children 负责装进这个壳里的“内容物”。一、children 到底是什…...

交付验收前批量筛一遍配图质量:桌面工具用法记录

如果你经常遇到这种场景&#xff1a;项目交付包里附带大量截图、现场照片&#xff0c;甲方要求「明显糊的、过曝的别混进来」&#xff0c;但文件夹嵌套很深&#xff0c;人工抽查像抽奖。可以试一款只做「打分按档归类」的 Windows 桌面工具&#xff0c;全称【批量图片质量检测筛…...

药流和人流哪个恢复快?术后修护行业洞察与实用指南

意外怀孕后&#xff0c;药流和人流的恢复差异及术后修护&#xff0c;是女性关注的核心话题&#xff0c;也是孕产修护领域的重点议题。术后修护作为缩短恢复周期、减少并发症的关键&#xff0c;其科学合理性直接影响女性生殖健康。本文结合行业现状与实用经验&#xff0c;探讨药…...

OpenClaw个人财务助手:Qwen3-14B分析消费记录生成报表

OpenClaw个人财务助手&#xff1a;Qwen3-14B分析消费记录生成报表 1. 为什么需要AI财务助手 上个月整理支付宝账单时&#xff0c;我盯着密密麻麻的消费记录发了半小时呆。餐饮、购物、交通的金额混在一起&#xff0c;根本分不清钱到底花在哪里。手动分类300多条记录后&#x…...

STM32开发中printf重定向的两种实现方法

1. STM32开发中的printf重定向需求解析在嵌入式开发中&#xff0c;调试信息的输出是开发过程中不可或缺的一环。对于STM32这类ARM Cortex-M系列微控制器而言&#xff0c;标准库中的printf函数默认是无法直接使用的&#xff0c;因为这类设备通常没有像PC那样的标准输出设备。这就…...

从Claude Code代码泄漏到AI Agent逻辑设计VS龙虾OpenClaw

近期 Anthropic的Claude Code 的源码泄露事件,为业界提供了一份价值连城的“活体解剖指南”。本文将深入对比高内聚的 Claude Code 架构与高解耦的 OpenClaw 通用框架,从系统执行逻辑、上下文管理、OS 沙盒交互以及记忆提纯等维度,探讨次世代 AI Agent 在模型推理与工程落地…...

MAX31865嵌入式驱动库:高精度RTD温度测量实战指南

1. 项目概述7Semi_MAX31865 是一款面向工业级高精度温度测量场景的嵌入式驱动库&#xff0c;专为 Maxim Integrated&#xff08;现属 Analog Devices&#xff09;MAX31865 RTD-to-digital 转换器芯片设计。该库并非简单封装&#xff0c;而是以底层硬件控制为核心&#xff0c;提…...

从 LLM 到 OpenClaw:七步看懂 Prompt、Memory、MCP、Skills、Agent

从 LLM 到 OpenClaw&#xff1a;七步看懂 Prompt、Memory、MCP、Skills、Agent 这两年 AI 术语越来越多&#xff1a;LLM、MCP、Agent、Skills、OpenClaw。 如果你不是技术背景&#xff0c;第一次看到这串词&#xff0c;基本都会懵。下面我用一个统一场景来讲&#xff1a;把 AI…...

A89306电机控制器驱动库:SPI寄存器级控制与FOC系统集成

1. A89306电机控制器驱动库技术解析与工程实践1.1 芯片定位与系统角色A89306是由Allegro MicroSystems推出的高集成度三相无刷直流&#xff08;BLDC&#xff09;电机控制器专用IC&#xff0c;面向中高端工业驱动与精密运动控制场景。该芯片并非通用MCU&#xff0c;而是集成了栅…...

002、零基础搭建你的第一个AI开发环境

昨天帮隔壁组实习生看代码&#xff0c;小伙子对着屏幕发愁&#xff1a;“环境都跑不起来&#xff0c;一训练就报cuda版本不匹配。”我凑过去一看&#xff0c;好家伙&#xff0c;系统里装了三个Python版本&#xff0c;conda环境混着pip装&#xff0c;torch版本和cuda差了两位小数…...

Arduino嵌入式多设备协同控制模板

1. 项目概述“TongHopThuVienCon1”&#xff08;越南语&#xff0c;意为“子库集成1号”&#xff09;并非一个独立功能完备的嵌入式开源库&#xff0c;而是一个面向Arduino平台的工程模板项目&#xff08;Arduino_Project_Template&#xff09;。其核心价值不在于提供特定外设驱…...

百度飞桨PaddleOCR图片印章检测技术简介

百度飞桨PaddleOCR图片印章检测技术简介 全文链接 百度飞桨PaddleOCR图片印章检测技术简介 github仓库&#xff1a;使用PaddleOCR识别图片红色印章文字 red-seal-ocr 3.X和2.X区别较大&#xff0c;建议使用3.X版本。 PaddleX简介 PaddleX github地址PaddleX模型产线使用概览…...

嵌入式与单片机:核心概念与开发实战解析

1. 嵌入式与单片机&#xff1a;从概念到实战的全面解析作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我经常被问到这样一个问题&#xff1a;"单片机不就是嵌入式吗&#xff1f;"这个问题看似简单&#xff0c;却反映了初学者对这两个概念的普遍困惑。今天&am…...

C语言实现进程调度算法:优先级与时间片轮转

1. 项目概述在嵌入式系统和操作系统开发中&#xff0c;进程调度是一个核心概念。今天我要分享的是如何在C语言中实现一个简单的程序调度机制&#xff0c;重点讲解高优先数调度算法和先来先服务算法的实现。这个项目非常适合想要深入理解操作系统底层原理的开发者&#xff0c;特…...

ESP32开发板变身万能协议分析仪

1. ESP32开发板的隐藏潜力&#xff1a;从物联网到万能协议分析仪当大多数人拿到ESP32开发板时&#xff0c;第一反应都是用它来做物联网项目。确实&#xff0c;这款集成了Wi-Fi和蓝牙功能的微控制器在智能家居、远程监控等领域表现出色。但今天我要告诉你的是&#xff0c;ESP32的…...

告别卡顿:在Windows10上通过QEMU与WHPX硬件加速高效部署Ubuntu20.04开发环境

1. 为什么选择QEMUWHPX方案&#xff1f; 很多开发者都遇到过这样的困境&#xff1a;在Windows系统上运行Linux虚拟机时&#xff0c;要么性能拉胯到让人抓狂&#xff0c;要么配置复杂得让人望而却步。我之前用VMware跑Ubuntu时&#xff0c;光是开个浏览器就能让CPU飙到100%&…...

OpenClaw安全实践:千问3.5-27B私有化部署下的权限管控

OpenClaw安全实践&#xff1a;千问3.5-27B私有化部署下的权限管控 1. 为什么需要关注OpenClaw的安全配置&#xff1f; 去年我在尝试用OpenClaw自动整理财务报表时&#xff0c;差点酿成一场灾难。当时我的脚本误将未加密的财务数据同步到了公开目录&#xff0c;幸亏及时发现。…...

信号量实战:多进程协同操作有限缓冲区的伪代码精解

1. 信号量机制与生产者-消费者模型 想象一下餐厅后厨的场景&#xff1a;厨师&#xff08;生产者&#xff09;不断制作菜品&#xff0c;服务员&#xff08;消费者&#xff09;将菜品端给顾客。如果厨师做菜太快&#xff0c;服务员来不及端走&#xff0c;菜品就会堆积&#xff1b…...

2025届必备的六大降重复率助手横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 纵然人工智能辅助毕业论文写作现如今已然成为一种学术方面的新常态&#xff0c;可是却需要去…...

Android音频开发避坑指南:用OboeTester的Device Report快速排查耳机兼容性问题

Android音频开发实战&#xff1a;用OboeTester精准诊断耳机兼容性问题 当你在星巴克掏出Type-C耳机准备调试刚写完的音频播放代码&#xff0c;却发现设备死活不出声——这种崩溃瞬间每个Android音频开发者都经历过。数字耳机兼容性问题就像薛定谔的猫&#xff0c;不到实际连接那…...

P6 v24.12 新功能实战:如何用‘基线预览’和‘取消链接’高效管理项目变更?

P6 v24.12 新功能实战&#xff1a;如何用‘基线预览’和‘取消链接’高效管理项目变更&#xff1f; 在复杂工程项目管理中&#xff0c;计划变更如同家常便饭。每次设计调整、资源变动或进度延误&#xff0c;都可能引发连锁反应。传统做法中&#xff0c;项目经理往往需要反复试…...

从一次深夜停电抢修说起:聊聊馈线自动化(FA)如何把故障恢复时间从小时级压到分钟级

从深夜抢修到智能自愈&#xff1a;馈线自动化如何重塑电网韧性 凌晨2点17分&#xff0c;某城市核心商圈突然陷入黑暗。传统配电网时代&#xff0c;这样的故障意味着至少3小时的停电——从人工报修、巡线排查到隔离修复&#xff0c;每一步都依赖人力响应。但此刻&#xff0c;调度…...

深入解析epoll:高并发网络编程核心技术

1. 理解高并发场景下的网络通信挑战在现代网络服务中&#xff0c;处理大量并发连接是一个常见需求。想象一个即时通讯服务器需要同时维持上百万用户的TCP连接&#xff0c;但实际活跃用户&#xff08;正在收发消息的&#xff09;可能只有几百个。传统做法如select/poll需要每次将…...

ILI9163C SPI TFT驱动库深度解析与嵌入式优化实践

1. TFT_ILI9163C 驱动库深度解析&#xff1a;面向嵌入式系统的高性能SPI TFT显示方案1.1 项目定位与工程价值TFT_ILI9163C 是一款专为嵌入式平台优化的高性能 SPI TFT 显示驱动库&#xff0c;核心目标是在资源受限的微控制器上实现接近硬件极限的图形刷新吞吐量。其设计哲学并非…...

无障碍阅读助手:OpenClaw+Phi-3-vision-128k-instruct实时解析复杂图表

无障碍阅读助手&#xff1a;OpenClawPhi-3-vision-128k-instruct实时解析复杂图表 1. 为什么需要图表无障碍解析工具 去年帮一位视障朋友准备资格考试时&#xff0c;我深刻体会到技术文档中的图表是如何成为"信息黑洞"的。当他用屏幕阅读器听到"参见图3"…...