.net 一次打开一个子窗体

.net 一次打开一个子窗体,.net,vb.net,winforms,.net,Vb.net,Winforms,我目前正在c#中开发独立的应用程序,而且我是c#的新手,所以不知道它的所有特性 在我的应用程序中,有一个主窗体的MDIContainer属性为true。。在主窗体中,我创建了一个菜单,通过它可以打开不同的子窗体 问题是,如果用户单击菜单项,表单将被打开,因为我已经创建了它的实例,并在单击事件中显示了它。但如果一个子表单已经打开,用户单击另一个子表单,则该子表单也将打开 在这种情况下,我希望自动关闭上一个子窗体 下面是示例代码 public void menu1_click(sender,e) {

我目前正在c#中开发独立的应用程序,而且我是c#的新手,所以不知道它的所有特性

在我的应用程序中,有一个主窗体的MDIContainer属性为true。。在主窗体中,我创建了一个菜单,通过它可以打开不同的子窗体

问题是,如果用户单击菜单项,表单将被打开,因为我已经创建了它的实例,并在单击事件中显示了它。但如果一个子表单已经打开,用户单击另一个子表单,则该子表单也将打开

在这种情况下,我希望自动关闭上一个子窗体

下面是示例代码

public void menu1_click(sender,e)
{
  Dim objForm1 As New Form1()
  objForm1.ShowDialog()
}
对于secode形式

public void menu2_click(sender,e)
{
Dim objForm2 As New Form2()
objForm2.ShowDialog()
}
Dim iobjForm2 As New Form2()
iobjForm2.ShowDialog()
所以这里两个表单都可以同时打开,但如果新表单打开,我希望前一个表单关闭。。一次一张表格

请忽略语法和准时错误,因为这只是一个示例。。
请给我建议最好的方法

您需要编写代码以打开该表单,如下所示:

对于打开的第一个表单,在MDI表单的单击事件中编写代码

Dim iobjForm1 As New Form1()
iobjForm1.ShowDialog()
对于secode形式

public void menu2_click(sender,e)
{
Dim objForm2 As New Form2()
objForm2.ShowDialog()
}
Dim iobjForm2 As New Form2()
iobjForm2.ShowDialog()
它将一次打开两张表单


希望这将对您有所帮助。

您需要编写代码以打开该表单,如下所示:

对于打开的第一个表单,在MDI表单的单击事件中编写代码

Dim iobjForm1 As New Form1()
iobjForm1.ShowDialog()
对于secode形式

public void menu2_click(sender,e)
{
Dim objForm2 As New Form2()
objForm2.ShowDialog()
}
Dim iobjForm2 As New Form2()
iobjForm2.ShowDialog()
它将一次打开两张表单


希望这对您有所帮助。

将第一个表单显示为模态。模式窗体将不允许打开新窗体,直到您将其关闭。

将第一个窗体显示为模式窗体。模式窗体将不允许打开新窗体,直到您将其关闭。

而不是在单击事件中声明窗口,使其成为全局窗口。然后,您要做的是检查表单中的属性。如果其他窗体为true,则您尝试打开的窗体可以使用该方法。

而不是在单击事件中声明窗口,使其成为全局窗口。然后,您要做的是检查表单中的属性。如果其他表单为true,则您尝试打开的表单可以使用该方法。

在MDI表单中创建以下函数

public void OpenForm(Form toOpen)
{
    foreach (Form child in MdiChildren)
        child.Close();

    toOpen.MdiParent = this;
    toOpen.Show();
}

在菜单项事件处理程序中调用它,如下所示
OpenForm(new Form1())
在MDI表单中创建以下函数

public void OpenForm(Form toOpen)
{
    foreach (Form child in MdiChildren)
        child.Close();

    toOpen.MdiParent = this;
    toOpen.Show();
}

在菜单项事件处理程序中调用它,如下所示
OpenForm(new Form1())

要关闭所有其他表单,需要创建一个类和静态方法,如下所示:

class Helper
{

    public static void HideAllForms()
    {
        Assembly currentAssembly = Assembly.GetExecutingAssembly();
        int count = Application.OpenForms.Count;
        for (int i = 0; i < count; i++)
        {
            Form f = Application.OpenForms[i];
            if (f.GetType().Assembly == currentAssembly && f.Name != "frmMDI") //Here 'frmMDI' is the name of mdiform.
            {
                f.Close();
            }
        }
    }
}

这对我来说很好,希望这也能对您起作用。

要关闭所有其他表单,您需要创建一个类和静态方法,如下所示:

class Helper
{

    public static void HideAllForms()
    {
        Assembly currentAssembly = Assembly.GetExecutingAssembly();
        int count = Application.OpenForms.Count;
        for (int i = 0; i < count; i++)
        {
            Form f = Application.OpenForms[i];
            if (f.GetType().Assembly == currentAssembly && f.Name != "frmMDI") //Here 'frmMDI' is the name of mdiform.
            {
                f.Close();
            }
        }
    }
}

这对我来说很好,希望这也能对您起作用。

如果您一次只希望存在一个子表单,可能还有其他机制比MDI表单更适合


例如,您可以创建用户控件,而不是使用子窗体。在主窗体的固定位置显示一个用户控件(例如,在面板内,用于定位),然后将其换成其他用户控件;这不是打开新的子窗口,而是关闭旧的子窗口。

如果您一次只希望存在一个子窗体,可能有其他机制比MDI窗体更适合


例如,您可以创建用户控件,而不是使用子窗体。在主窗体的固定位置显示一个用户控件(例如,在面板内,用于定位),然后将其换成其他用户控件;这不是打开新的子窗口,而是关闭旧的子窗口。

您可以单击“添加窗口”-->表单。然后你将从代码中打开它。@John我不明白你的意思。。如果新窗体打开,我想关闭上一个子窗体。。换句话说,一次一个子表单,你能发布你正在使用的代码吗?这样我们就可以对如何修复它提出建议。现在这或多或少是一个猜测游戏。如果您一次只希望存在一个子表单,那么可能有其他机制比MDI表单更适合。例如,不使用子窗体,而是一次在主窗体上显示一个用户控件。@waldrumpus我是c#的新手,请您详细解释一下……您可以单击“添加窗口”-->form。然后你将从代码中打开它。@John我不明白你的意思。。如果新窗体打开,我想关闭上一个子窗体。。换句话说,一次一个子表单,你能发布你正在使用的代码吗?这样我们就可以对如何修复它提出建议。现在这或多或少是一个猜测游戏。如果您一次只希望存在一个子表单,那么可能有其他机制比MDI表单更适合。例如,不使用子窗体,而是在主窗体上一次显示一个用户控件。@waldrumpus我是c#新手,您能解释一下吗?我知道这一点。。但是我想一次打开一张表格如果新的表格打开了以前的表格就应该关闭我知道这一点。。但是我想一次打开一张表格如果新的表格打开之前的表格就应该关闭