如何实现子窗体触发父窗体事件以更新状态栏
父窗体Panel加载子窗体时,子窗体更新父窗体状态栏的实现方案
我开发了一个包含Panel的父窗体,该Panel用于加载子窗体。需求是所有加载到该Panel中的子窗体都能更新父窗体上的状态栏。由于子窗体被嵌套在父窗体的Panel内,若在子窗体中单独创建状态栏,无法显示在界面最底部,因此需要通过事件机制实现子窗体通知父窗体更新状态栏。此外,为了让状态栏消息即时显示,必须刷新状态栏,这种方式也更安全。
现有Panel加载子窗体的代码
frm_Copydata frm_Copydata = new frm_Copydata(); frm_Copydata.TopLevel = false; frm_Copydata.Dock = DockStyle.Fill; frm_Copydata.FormBorderStyle = FormBorderStyle.None; pnl_FormHolder.Controls.Add(frm_Copydata); cmb_SelectAction.SelectedIndex = -1; frm_Copydata.Show();
已验证可行的解决方案
1. 自定义事件参数类
用于传递状态栏更新的消息内容:
public class cl_StatusEventArgs : EventArgs { public string strStatus { get; set; } }
2. 子窗体中定义事件并触发更新
在子窗体里声明事件,当需要更新状态栏时触发该事件:
// 定义状态栏更新事件的委托 public delegate void StatusChangedEventHandler(object source, cl_StatusEventArgs args); // 声明事件 public event StatusChangedEventHandler StatusChanged; // 触发事件的保护方法 protected virtual void OnStatusChanged(string status) { if (StatusChanged != null) { StatusChanged(this, new cl_StatusEventArgs(){ strStatus = status }); } } // 在子窗体业务逻辑中需要更新状态栏时,调用以下代码 var strStatus = "正在处理FITS图像文件"; OnStatusChanged(strStatus);
3. 父窗体中绑定事件并处理更新
在父窗体加载子窗体时,绑定子窗体的事件,实现状态栏更新逻辑:
// 状态栏更新事件的处理方法 private void OnStatusChanged(object source, cl_StatusEventArgs e) { MessageBox.Show("从Copydata窗体触发了事件"); // 更新状态栏标签文本 lbl_sts_ParmentFormStatus.Text = e.strStatus; // 刷新状态栏控件,确保消息即时显示 sts_ParmentFormStatusStrip.Refresh(); }
注意:需要在父窗体创建子窗体的代码中,添加事件绑定语句才能生效:
frm_Copydata.StatusChanged += OnStatusChanged;
内容的提问来源于stack exchange,提问作者OldAndRetired
相关产品推荐
相关产品推荐

