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

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

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

一、功能说明

本案例实现一套标准的系统参数设置流程:

  1. 程序目录自动生成sysInfo.ini配置文件
  2. 主窗体加载时自动读取配置
  3. 点击按钮弹出参数设置窗口
  4. 下拉框绑定枚举、文本框加载配置
  5. 修改后写入配置文件,重启 / 重新加载生效

适用场景: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; } }

三、主窗体逻辑(FrmMain)

1. 定义配置路径与全局对象

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

四、参数设置窗体(FrmParamSet)

1. 窗体构造函数(接收参数)

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防止输入非法值崩溃

六、完整执行流程

  1. 启动程序 → 加载FrmMain→ 读取sysInfo.ini
  2. 无文件 → 自动生成;读取失败 → 提示
  3. 点击参数设置→ 弹窗加载当前配置
  4. 修改参数 → 点击保存 → 写入 INI
  5. 重启 / 重新加载 → 新配置生效
http://www.jsqmd.com/news/594367/

相关文章:

  • SEO优化师如何制定优化策略和计划_SEO优化师如何分析网站流量和排名数据
  • OpenClaw 太难装了?试试 LangTARS:一行命令部署 + WebUI 管理面板,还能接入 Dify/Coze/nn??
  • Windows下OpenClaw安装指南:百川2-13B-4bits模型调用全流程
  • C语言指针核心解析与六大实战应用
  • Web自动化工具Midscene整理
  • MAX31865嵌入式驱动库:高精度RTD温度测量实战指南
  • AI 编程上下文管理新范式(非常详细),Spec 机制从入门到精通,收藏这一篇就够了!
  • Linux设备驱动模型与GPIO子系统实战解析
  • Docker 与虚拟机到底有什么本质区别?场景选择与最佳实践
  • UE4动画师救星:用Control Rig快速修复动捕数据的5个实战技巧与避坑指南
  • 嵌入式技术面试核心策略与实战技巧
  • 全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?
  • 【笑小枫AI系列】Prompt工程避坑指南(建议收藏)
  • 从Claude Code代码泄漏到AI Agent逻辑设计VS龙虾OpenClaw
  • AI绘画联动:OpenClaw调用Qwen3-14B生成Stable Diffusion提示词
  • 【启动心法】别以为 main() 是世界的起点!撕碎 C/C++ 运行时的伪装,手撕 Reset_Handler 夺回单片机开机绝对主权
  • 嵌入式设备DHCP配置与优化实战
  • EasyExcel日期处理全指南:从类型选择到格式转换的5个关键细节
  • 从修车铺到世界冠军,从废塑料到再生资源:一场关于坚持与价值的时代对话
  • StopwatchLib:嵌入式高精度时间测量与频率分析库
  • OZON选品指南:揭秘当前最可靠的品牌与实用工具
  • STM32开发中printf重定向的两种实现方法
  • Threejs 使用Line2实现自定义线条宽度的实战指南
  • authentik开源身份认证与管理平台-与 Rancher 集成(11)
  • OpenClaw任务监控方案:千问3.5-9B异常告警设置
  • 快照模式 vs 命令模式:一篇分清什么时候用谁
  • 嵌入式MIDI库开发:UART协议实现与实时控制
  • OpenClaw个人财务助手:Qwen3-14B分析消费记录生成报表
  • OZON选品工具深度测评:这四款助你精准掘金俄罗斯市场
  • 嵌入式看门狗库:Mbed OS多实例WDT管理与超时回调实现