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

C#事件声明办法

publiceventAction<string>?OnLogMessage;publiceventAction<bool>?OnAutoRunCompleted;_modbusClient.OnLogMessage+=LogMessage;_modbusClient.OnDeviceStatusChanged+=OnModbusDeviceStatusChanged;//------直接调用//_plcModbusClient.OnLogMessage += (msg) => LogMessage($"[PLC串口] {msg}");//_plcModbusClient.OnDeviceStatusChanged += (addr, online) =>//{// LogMessage($"PLC设备 {addr} 状态: {(online ? "在线" : "离线")}");// };privatevoidLogMessage(stringmessage){if(txtLog.InvokeRequired){txtLog.Invoke(newAction<string>(LogMessage),message);return;}txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}]{message}\r\n");txtLog.ScrollToCaret();}privatevoidOnModbusDeviceStatusChanged(byteaddress,boolisOnline){if(InvokeRequired){Invoke(newAction(()=>OnModbusDeviceStatusChanged(address,isOnline)));return;}LogMessage($"Modbus设备{address}状态:{(isOnline?"在线":"离线")}");}

其他窗体也可以调取这个事件来触发当前窗体内的数据变化(事件可以加在本地):

例如 :SerialPortSettings:form 下 创建一个public 的事件
// 回调事件,用于通知主窗体状态变化

publiceventAction<string,Color>?OnStatusUpdated;

本窗体内事件的操作:

OnStatusUpdated?.Invoke("正在检测设备...",Color.Yellow);

引用的窗体需要这样调取:

SerialPortSettingssettingsForm=newSerialPortSettings(_modbusClient);//实例化formsettingsForm.OnStatusUpdated+=(status,color)=>UpdateStatusComm(status,color);//挂载事件///settingsForm.OnStatusUpdated += UpdateStatusComm(status, color);//这样应该可以///创建事件方法publicvoidUpdateStatusComm(stringtext,Color?color=null){if(InvokeRequired){Invoke(newAction(()=>UpdateStatusComm(text,color)));return;}lblStatusComm.Text=$"通信状态:{text}";if(color.HasValue)lblStatusComm.ForeColor=color.Value;}

这样就能不同窗体之间的事件调取

-------------------------------------------------------------多参数操作:

1.在需要操作的类下面创建事件

publiceventAction<DeviceInfo,bool>?OnDeviceStatusChanged;

写入方法,以便可以轻松的写入需要调用的界面的事件方法中:

_modbusClient.OnDeviceStatusChanged+=(addr,success)=>{vardevice=_devices.FirstOrDefault(d=>d.SlaveAddress==addr);if(device!=null){device.Status=success?DeviceStatus.Online:DeviceStatus.Offline;device.LastCommunication=DateTime.Now;device.FailCount=success?0:device.FailCount+1;OnDeviceStatusChanged?.Invoke(device,success);}};

2.其他界面调用时需要的操作:

实例化后再初始化时先挂载事件下的方法:

_deviceManager.OnDeviceStatusChanged+=OnDeviceManagerStatusChanged;

事件方法操作本身,这样操作类的事件触发就到了这这个页面了:

privatevoidOnDeviceManagerStatusChanged(DeviceInfodevice,boolisOnline){if(InvokeRequired)//先判断是否异步{Invoke(newAction(()=>OnDeviceManagerStatusChanged(device,isOnline)));return;}if(device.DeviceId>=1&&device.DeviceId<=6){_deviceOnlineStatus[device.DeviceId]=isOnline;}LogMessage($"设备{device.Name}(地址:{device.SlaveAddress}) 状态:{(isOnline?"在线 ✓":"离线 ✗")}");UpdateTabColors();if(device.DeviceId==_currentDeviceId){UpdateCurrentDeviceStatus(isOnline);}intonlineCount=_deviceOnlineStatus.Count(s=>s==true);if(onlineCount>0){UpdateStatusComm($"已连接 ({onlineCount}/6)",Color.Green);}else{UpdateStatusComm("未连接",Color.Red);}}
http://www.jsqmd.com/news/1380540/

相关文章:

  • Selenium自动化测试中ChromeDriver版本适配与配置全攻略
  • Linux服务器不死马后门应急响应实战:从查杀到加固全流程解析
  • 如何在10分钟内搭建个人私有云相册:Lychee开源相册系统完整实战指南
  • 技术收敛陷阱:模型训练与分布式系统优化的实战解析
  • 生信分析入门:FASTQ数据质控与预处理实战指南
  • 从MRC到IRC:5G基站接收机算法演进与性能优化
  • Unity热更新方案深度对比:HybridCLR与ILRuntime的性能、原理与选型指南
  • 西藏自治区小学生学武术的武校|林芝市、山南市、那曲市、阿里地区文武学校推荐口碑盘点 - 圣龙武术朱老师
  • 【四校联合主办 | 武汉举办】第九届机械工程与智能制造国际会议(WCMEIM 2026)
  • UE5第三方插件导入全攻略:从Marketplace到GitHub的实战指南
  • 2026吕梁外墙漏水避坑指南 - 企业资讯
  • 2026泸州外墙漏水避坑指南 - 企业资讯
  • 爬虫进阶:JS逆向破解Canvas图片置乱反爬技术实战
  • 盘点国内优质工业大模型厂商,重点解析中控技术工业 AI 大模型场景落地能力
  • 大模型-新手安装Ollama以及大模型调用
  • 2026商丘外墙漏水避坑指南 - 伶鹿到家
  • SVG.js 入门指南:简化前端矢量图形操作与动画开发
  • R语言主成分分析可视化实战:用FactoMineR与factoextra打造专业级图表
  • 2026工业制造企业找GEO优化厂家:实力服务商甄选大盘点 合规适配指南+合作避坑全攻略 - 产业观察报
  • OpenSpec与Superpowers:AI编码的规格驱动开发(SDD)实战指南
  • Vue3+Element Plus全局图标管理:从手动引入到自动化方案实战
  • 汽车电子项目实战:型材铝合金外壳选型、设计与组装全流程指南
  • 2026西宁外墙漏水避坑指南 - 企业资讯
  • LeetCode 21. 合并两个有序链表
  • Local-first Markdown编辑器:离线优先的极致写作体验与数据自主方案
  • 【一个聚合支付平台,持续更新】
  • CAN总线远距离通讯实战:从原理到部署的完整解决方案
  • Linux-----Linux文件系统解读
  • AI多Agent协作系统实战(二十二):从6列到12列——任务监控报告的进化之路
  • 2026洛阳外墙漏水避坑指南 - 伶鹿到家