C# 选项卡式菜单-每个选项卡作为单独的CS文件

C# 选项卡式菜单-每个选项卡作为单独的CS文件,c#,tabs,C#,Tabs,我是C#新手,已经创建了一个基本程序 我的“主菜单”设置为顶部有7个选项卡。 我已经设置了CASE,因此当用户选择选项卡时,它会将特定子菜单(frmxxmenu)添加到控件中 问题是 这是正确的吗 现在每个表单都将打开每次单击,因此我会不断生成表单的实例(我可以看到我的进程内存在增加!) 等7个标签 我的方向正确吗?如果正确,我如何解决这种情况 我在想,当你不再活跃的时候。。或者当一个实例已经打开时,不创建新实例 第二期 其中一个表单打开大约需要2秒钟(它显示的是一个基于sql的图表)。当我打

我是C#新手,已经创建了一个基本程序

我的“主菜单”设置为顶部有7个选项卡。 我已经设置了CASE,因此当用户选择选项卡时,它会将特定子菜单(frmxxmenu)添加到控件中

问题是

  • 这是正确的吗
  • 现在每个表单都将打开每次单击,因此我会不断生成表单的实例(我可以看到我的进程内存在增加!)

  • 等7个标签

    我的方向正确吗?如果正确,我如何解决这种情况

    我在想,当你不再活跃的时候。。或者当一个实例已经打开时,不创建新实例

    第二期

    其中一个表单打开大约需要2秒钟(它显示的是一个基于sql的图表)。当我打开frmmain()启动程序时,如何在选项卡中加载此页面,然后当我打开选项卡时,它将被加载? 我试着把

    frmcollectmenu frmcollectmenu = new frmcollectmenu();
        frmcollectmenu.TopLevel = false;
        tabcollect.Controls.Add(frmcollectmenu);
        frmcollectmenu.Dock = DockStyle.Fill;
        frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    frmcollectmenu.visible = false;
    frmcollectmenu.Show();
    

    (添加了可见部分)然后,我在选择选项卡时再次使其可见,但这似乎仍需要几秒钟时间,而且无法正常工作。

    如果您只希望打开一个表单实例,则应检查应用程序。OpenForms集合如果系统已在其中引用了您的表单

    case "tabcollect":
        frmcollectmenu f = Application.OpenForms["frmcollectmenu"];
        if(f == null)
        {
            frmcollectmenu frmcollectmenu = new frmcollectmenu();
            frmcollectmenu.TopLevel = false;
            tabcollect.Controls.Add(frmcollectmenu);
            frmcollectmenu.Dock = DockStyle.Fill;
            frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            frmcollectmenu.Show();
       }
       else
            f.Show();
       break;
    
    请注意,如果将窗体的name属性保留为其默认名称(与窗体的类名相同),则此操作有效

    您还可以尝试在每个表单的单独方法中隔离有关打开表单的逻辑,并实现一个字典,在其中存储tab键和用户选择该特定选项卡时要执行的操作

      // At form global level....
      Dictionary<string, Action> tabActions = new Dictionary<string, Action>()
      {
         { "tabCollect", runCollect },
         { .....                    },
             so on for other tabs
      }
    
      // The logic for a particular form (the same are needed for others forms)
      private static void runCollect()
      {
        frmcollectmenu f = Application.OpenForms["frmcollectmenu"];
        if(f == null)
        {
            frmcollectmenu frmcollectmenu = new frmcollectmenu();
            frmcollectmenu.TopLevel = false;
            tabcollect.Controls.Add(frmcollectmenu);
            frmcollectmenu.Dock = DockStyle.Fill;
            frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            frmcollectmenu.Show();
       }
       else
            f.Show();
      }
    

    如果只希望打开表单的一个实例,则应检查Application.OpenForms集合(如果系统已引用其中一个表单)

    case "tabcollect":
        frmcollectmenu f = Application.OpenForms["frmcollectmenu"];
        if(f == null)
        {
            frmcollectmenu frmcollectmenu = new frmcollectmenu();
            frmcollectmenu.TopLevel = false;
            tabcollect.Controls.Add(frmcollectmenu);
            frmcollectmenu.Dock = DockStyle.Fill;
            frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            frmcollectmenu.Show();
       }
       else
            f.Show();
       break;
    
    请注意,如果将窗体的name属性保留为其默认名称(与窗体的类名相同),则此操作有效

    您还可以尝试在每个表单的单独方法中隔离有关打开表单的逻辑,并实现一个字典,在其中存储tab键和用户选择该特定选项卡时要执行的操作

      // At form global level....
      Dictionary<string, Action> tabActions = new Dictionary<string, Action>()
      {
         { "tabCollect", runCollect },
         { .....                    },
             so on for other tabs
      }
    
      // The logic for a particular form (the same are needed for others forms)
      private static void runCollect()
      {
        frmcollectmenu f = Application.OpenForms["frmcollectmenu"];
        if(f == null)
        {
            frmcollectmenu frmcollectmenu = new frmcollectmenu();
            frmcollectmenu.TopLevel = false;
            tabcollect.Controls.Add(frmcollectmenu);
            frmcollectmenu.Dock = DockStyle.Fill;
            frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            frmcollectmenu.Show();
       }
       else
            f.Show();
      }
    

    @虽然它正在编译,但当它们打开更多实例时,每次进程内存都会增加。这显然不是一项“好技术”,因此我正在学习如何更聪明地使用它:)@YvetteColomb它正在编译,但随着它们打开更多实例,进程内存每次都会增加。这显然不是“好的技巧”,所以我正在学习如何更聪明:)那么我在每个案例中做a,b,c,d,e?难道没有办法在案例开始“Form open=Application.OpenForms[openfrm];”或其他东西,然后openfrm=Application.OpenForms[“frmcollectmenu”];只有在切换之后,您才知道要检查哪个表单。您可以创建一个字典,其中键是选项卡名称,值是一个函数委托,该函数委托运行创建或重新显示特定表单所需的特定代码。但我不认为这真的是一个很大的区别。谢谢我喜欢这个方法的想法,看起来有点干净?有一些优点。中心点是表单开头的字典,您可以添加新的标签代码,只需在那里添加一个新条目(当然还有方法),而无需使用大量的切换代码。一旦学会了这个技巧,这就简化了代码的压缩。我还应该补充一点,这种字典方法是编译器在达到一定数量的情况下如何转换开关。(不知道确切的数字)谢谢史蒂夫,谢谢。那么我为每个表格做a,b,c,d,e?难道没有办法在案例开始“Form open=Application.OpenForms[openfrm];”或其他东西,然后openfrm=Application.OpenForms[“frmcollectmenu”];只有在切换之后,您才知道要检查哪个表单。您可以创建一个字典,其中键是选项卡名称,值是一个函数委托,该函数委托运行创建或重新显示特定表单所需的特定代码。但我不认为这真的是一个很大的区别。谢谢我喜欢这个方法的想法,看起来有点干净?有一些优点。中心点是表单开头的字典,您可以添加新的标签代码,只需在那里添加一个新条目(当然还有方法),而无需使用大量的切换代码。一旦学会了这个技巧,这就简化了代码的压缩。我还应该补充一点,这种字典方法是编译器在达到一定数量的情况下如何转换开关。(不确定确切数字)谢谢史蒂夫,谢谢。