C#中如何将子窗体的双击事件传递给父窗体?
问题排查与修复方案
核心问题点
- 子窗体构造函数名称不匹配:子窗体类名为
Child,但构造函数写的是CtrlTest(),导致SetCommand()方法从未被调用,按钮的DoubleClick事件完全没绑定,双击自然无反应。 - 多余的手动计数逻辑:
DoubleClick事件本身就是系统在用户双击按钮时才会触发的事件,手动用btnCount计数完全画蛇添足,反而导致逻辑混乱,触发后执行错误分支。 - 冗余的参数传递:事件里传递的
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
相关产品推荐
相关产品推荐

