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

C#中如何将子窗体的双击事件传递给父窗体?

问题排查与修复方案

核心问题点

  1. 子窗体构造函数名称不匹配:子窗体类名为Child,但构造函数写的是CtrlTest(),导致SetCommand()方法从未被调用,按钮的DoubleClick事件完全没绑定,双击自然无反应。
  2. 多余的手动计数逻辑:DoubleClick事件本身就是系统在用户双击按钮时才会触发的事件,手动用btnCount计数完全画蛇添足,反而导致逻辑混乱,触发后执行错误分支。
  3. 冗余的参数传递:事件里传递的state(按钮Enabled状态)和当前需求无关,属于不必要的参数。

修正后的代码

子窗体代码

public enum CommandType
{
    SetCycleCount,
    ClearFaultCount,
    ClearGUIControl,
    ClearBackData
}

public partial class Child : Form
{
    // 简化事件委托,移除不需要的state参数
    public delegate void OnDblClickedBtn(CommandType operationType);
    public event OnDblClickedBtn BtnClickedEvent;

    // 修正构造函数名称,与类名保持一致
    public Child()
    {
        InitializeComponent();
        SetCommand();
    }

    public void SetCommand()
    {
        SetCycleCnt_btn.Tag = CommandType.SetCycleCount;
        ClrFaultCnt_btn.Tag = CommandType.ClearFaultCount;
        ClrGuiCtrl_btn.Tag = CommandType.ClearGUIControl;
        ClrBackData_btn.Tag = CommandType.ClearBackData;

        var btnList = Controls.OfType<Button>().ToList();

        foreach (var btn in btnList)
        {
            btn.DoubleClick += CommandOnClicked;
        }
    }

    private void CommandOnClicked(object sender, EventArgs e)
    {
        var btn = (Button)sender;
        BtnClickedEvent?.Invoke((CommandType)btn.Tag);
    }
}

父窗体代码

// 确保child是父窗体的类级变量,避免被GC回收导致事件失效
private Child child;

private void OpenChildForm()
{
    child = new Child();
    child.BtnClickedEvent += OnChildBtnDoubleClicked;
    child.MdiParent = this;
    child.Show();
}

// 移除冗余计数逻辑,直接响应双击事件执行对应操作
private void OnChildBtnDoubleClicked(CommandType commandType)
{
    switch (commandType)
    {
        case CommandType.ClearBackData:
            // 替换为实际清除备份数据的逻辑
            MessageBox.Show("已触发清除备份数据操作");
            break;
        case CommandType.ClearFaultCount:
            // 替换为实际清除故障计数的逻辑
            MessageBox.Show("已触发清除故障计数操作");
            break;
        case CommandType.ClearGUIControl:
            // 替换为实际清除GUI控件数据的逻辑
            MessageBox.Show("已触发清除GUI控件数据操作");
            break;
        case CommandType.SetCycleCount:
            // 替换为实际设置循环计数的逻辑
            MessageBox.Show("已触发设置循环计数操作");
            break;
    }
}

额外注意事项

  • 父窗体中的child必须是类级成员变量,不能在局部方法中声明后就销毁,否则子窗体被GC回收后事件会失效。
  • 如果需要防止重复触发,可以在事件执行时暂时禁用对应按钮,操作完成后再启用,无需手动计数。

内容的提问来源于stack exchange,提问作者EverActive

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:03:29