2

到目前为止,作为一名 .net 开发人员,我大量使用 mdi 表单来显示特定的“菜单点”,例如“模块 1”“模块 2”等。

我一直在这样做:

  • 创建一个将“isMdiContainer”设置为“true”的父表单
  • 在 mdi 容器中创建一个菜单条
  • 创建一个实现单例的子表单,以便表单只显示一次
  • 将类似以下代码的内容添加到 mdi 容器中:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Myapp
{

public partial class MdiContainer : Form
{
    private module1 Module1Window;
    private module2 Module2Window;
    private module3 Module3Window;

    public FormContainer()
    {
        InitializeComponent();
        this.Module1Window = modul1.getInstance();
        this.Module1Window.MdiParent = this;
        this.Module2Window = modul2.getInstance();
        this.Module2Window.MdiParent = this;
        this.Module3Window = modul3.getInstance();
        this.Module3Window.MdiParent = this;
        this.Module1Window.Show();
    }
    private void module1ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Module3Window.Hide();
        this.Module2Window.Hide();
        this.Module1Window.Show();
    }       
    private void module2ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Module1Window.Hide();
        this.Module3Window.Hide();
        this.Module2Window.Show();
    }
    private void module3ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Module1Window.Hide();
        this.Module2Window.Hide();
        this.Module3Window.Show();
    }
}

}

现在,这显然工作正常。但是维护起来很痛苦。每次我想添加另一个子表单时,我必须:

  • 实现单例
  • 在mdi容器中创建对应的属性
  • 获取实例并设置 mdi 父级
  • 单击其他按钮时隐藏新表单
  • 单击相应按钮时显示表单并隐藏所有其他表单

有什么更优雅的方法,或者说更有效的方法来归档它?

4

1 回答 1

1

你什么时候创建菜单项?这些是与子表单一起动态创建的吗?

如果是这样,您可以做的是创建表单并将其添加到列表中,并将菜单项的 Tag 属性分配给表单。将所有菜单项单击事件分配给同一个处理程序,并在处理程序中执行此操作...

private void menuStrip_Click(object sender, EventArgs e)
{
    var menu = (ToolStripItem)sender;
    var viewForm = (Form)sender.Tag;
    foreach(Form childForm in _childForms)
        childForm.Hide();
    viewForm.Show();
}

无论您有多少表单,都可以使用相同的处理程序。

或者,您可以拥有一个作为标签的键并拥有一个Dictionary<string, Form>,这样您就可以更懒惰地创建表单,但是概念是相同的。

于 2010-07-21T11:10:45.827 回答