You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现子窗体触发父窗体事件以更新状态栏

父窗体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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:55:28