C#从子表格调用MDI孩子

时间:2011-03-29 10:50:46

标签: c# mdi mdichild mdiparent

我有这些表格:

MainScreen - MDI容器
DataBaseOutput - child
NewAnime - 孩子

DataBaseOutput有一个tab控件,用于保存datagrids,每个datagrids用于不同的表。我使用访问数据库。

在这些标签中,有一个menustrip,其中将调用“新建”,“编辑”,“删除”等功能。现在,当我在第一个选项卡的menustrip上并单击“新建”时,我想在MDI容器内打开“NewAnime”表单。然而,这不符合我的计划。起初我试图从子窗体(DataBaseOutput)中调用它。这导致打开一个新的表单而不是一个孩子。当我把它变成一个孩子时它没有出现。

然后我做了很多事情,但我还是没想出来。

这是调用表单的当前代码。它使用主窗体中的方法调用表单:

private void NewAnime_Click(object sender, EventArgs e)
{
    MainScreen main = new MainScreen();
    main.mShowForm(2);

    this.Close();
}

主要形式的方法:

// Forms for MDI Parent
DataBaseOutput OutputForm = new DataBaseOutput();
NewAnime AddAnime = new NewAnime();

// How i made them childs (this is at the InitializeComponent(); part)
OutputForm.MdiParent = this;
AddAnime.MdiParent = this;

public void mShowForm(int formnumber)
{
    switch (formnumber)
    {
        case 1: OutputForm.Show(); break;
        case 2: AddAnime.Show(); break;
    }
}

有没有人知道我做错了什么,也许有更好的主意?这可能有点太多了,但正如我所说,这是我第一次使用MDI表单而我只是想让它运行起来。

1 个答案:

答案 0 :(得分:1)

您是否已将MainForm设为MDIContainer?为此,请将其IsMdiContainer属性设置为true;另外,请检查它是否有FileWindow个顶级菜单项以及NewClose个菜单项。 (教程建议这一点,我知道它至少应该有一个Window菜单项。

请查看本教程以获取更多指导:Creating MDI Child Forms (MSDN)

编辑:更仔细地看一下,看来你正在创建一个新的MainForm实例,并试图将该表单显示为该实例的子表单,而不是在现有表单中显示它MainForm的。我假设你已经有一个MainForm实例打开了吗?假设OutputForm和AddAnime表单是MainForm的子表单,您可以像这样调用现有实例的方法:

private void NewAnime_Click(object sender, EventArgs e)
{
    this.ParentForm.mShowForm(2);
    this.Close();
}

但理想情况下,您应该在MainForm侦听的DataBaseOutput上有一个事件,并在引发事件时显示新的Form。有关详细信息,请参阅此处(它讨论用户控件而非子表单,但原理相同)

Calling parent form functions from a user control