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

C#如何在switch case中合并菜单项逻辑并解决子窗体不显示问题

问题背景
  • 父窗体View菜单下配置了多个菜单项,点击每个菜单项需要打开对应子窗体
  • 原本可以为每个菜单项单独编写点击事件处理方法,现在需要把所有菜单项的处理逻辑整合到switch case结构中
  • 当前整合后的代码运行无报错,但子窗体无法正常显示

菜单结构示意图


原有单菜单项事件实现
private void child1ToolStripMenuItem_Click(object sender, EventArgs e)
{
  if(Application.OpenForms["Child1"] is Child1 ch1)
  {
    ch1.Focus();
    return;
  }
  ch1= new Child1();
  ch1.Name = name1; //父窗体中赋值的name
  ch1.Age = age1; // 父窗体中赋值的age;
}

问题原因

你写的整合代码有三个核心问题:

  1. 事件绑定对象错误:你把点击事件绑定到了父级View菜单项上,而不是每个子菜单项,点击子菜单时不会触发父菜单的点击事件,核心逻辑根本没有执行
  2. 判断的Name属性不匹配:就算把事件绑定到所有子菜单项,你switch里判断的menu.Name是菜单项控件的实际名称(默认生成规则是子项文本+ToolStripMenuItem,比如child1ToolStripMenuItem),和你写的"Child1"字符串完全不对应,所有case分支都匹配失败
  3. 方法名大小写错误:Winform中显示窗体的方法是首字母大写的Show(),C#是大小写敏感语言,小写的show()本身就不符合语法规则,需要修正。

正确实现步骤
  1. 选中所有子菜单项(Child1、Child2、Child3对应的菜单项),在属性窗口的事件列表中,把Click事件统一绑定到你写的viewToolStripMenuItem_Click处理方法上,不要绑定到父级View菜单
  2. 修正switch分支的匹配值,和菜单项实际的Name属性保持一致,也可以用菜单项的Tag属性存对应标识做匹配,避免后续修改控件名导致逻辑失效
  3. 补全窗体显示逻辑,如果是Mdi多文档架构,需要额外给子窗体指定MdiParent属性

修正后的完整代码:

private void viewToolStripMenuItem_Click(object sender, EventArgs e)
{
    // 校验触发事件的对象是否为有效菜单项
    if (sender is not ToolStripMenuItem clickedMenu) return;

    switch (clickedMenu.Name)
    {
        // 分支字符串需和对应子菜单项的Name属性完全一致,可在设计器属性面板查看
        case "child1ToolStripMenuItem":
            if (Application.OpenForms["Child1"] is Child1 ch1)
            {
                ch1.Focus();
                return;
            }
            ch1 = new Child1();
            ch1.Name = name1;
            ch1.Age = age1;
            // 如果是Mdi多文档界面,取消注释下面这行指定父容器
            // ch1.MdiParent = this;
            ch1.Show();
            break;
        case "child2ToolStripMenuItem":
            if (Application.OpenForms["Child2"] is Child2 ch2)
            {
                ch2.Focus();
                return;
            }
            ch2 = new Child2();
            ch2.Name = name2;
            ch2.Age = age2;
            // ch2.MdiParent = this;
            ch2.Show();
            break;
        case "child3ToolStripMenuItem":
            if (Application.OpenForms["Child3"] is Child3 ch3)
            {
                ch3.Focus();
                return;
            }
            ch3 = new Child3();
            ch3.Name = name3;
            ch3.Age = age3;
            // ch3.MdiParent = this;
            ch3.Show();
            break;
        default:
            break;
    }
}

优化提示:可以给每个子菜单项的Tag属性赋值为对应子窗体的类型(比如typeof(Child1)),后续新增子窗体不需要写冗长的switch分支,直接通过反射创建窗体实例即可,代码复用性更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:09:11