ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C#事件声明办法

2026/8/12 20:01:23 拓冰建站 浏览量
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);}}