C# 如何从子窗体调用 MDI 子窗体

3

我有以下这些表格:

MainScreen - MDI容器
DataBaseOutput - 子表格
NewAnime - 子表格

DataBaseOutput 有一个选项卡控件,其中包含不同表格的数据网格。我使用的是 Access 数据库。

在这些选项卡中,有一个菜单栏,其中包含“新建”、“编辑”、“删除”等功能。当我在第一个选项卡的菜单栏上,点击“新建”时,我想要在 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个回答

1

您是否将MainForm设置为MDIContainer?要做到这一点,需要将其IsMdiContainer属性设置为true;同时,请检查它是否有文件(File)窗口(Window)顶级菜单项以及新建(New)关闭(Close)菜单项。 (教程建议这样做,我知道它至少应该有一个窗口(Window)菜单项)。

请参考本教程获取更多指导:创建 MDI 子窗体 (MSDN)

编辑:仔细查看后,看起来您正在创建MainForm的新实例,并尝试将该窗体显示为该实例的子窗体,而不是在现有的MainForm中显示它。我假设您已经在此时打开了MainForm的实例?并且假设OutputForm和AddAnime表单是MainForm的子窗体,您可以像下面这样调用现有实例的方法:

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

但是理想情况下,您应该在DataBaseOutput上拥有一个事件,MainForm监听该事件,并在触发事件时显示新的表单。这里有更多信息(它谈论的是用户控件而不是子窗体,但原则相同)

从用户控件调用父窗体函数


是的,它是一个MDI容器,一切都在那里。想法是打开一个新的子窗体(AddAnime)并填充它,然后再关闭它,但我希望它在MDI容器内部。 无论如何,我需要从一个子窗体调用另一个子窗体,但似乎无法正确实现。我可以从主窗体调用子窗体,它可以工作,但我无法从其他子窗体调用子窗体。 - Deep Frozen
@你的修改:好的,谢谢,但是我需要在哪里显示DataBaseOutput表单,MainForm是它的父表单吗?因为我现在无法运行它。 - Deep Frozen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接