一次打开一个子表单

时间:2012-07-27 07:19:45

标签: .net vb.net winforms

我目前正在开发c#中的独立应用程序,我也是c#的新手,所以不知道它的所有功能..

在我的应用程序中,我有一个主要表单,其中MDIContainer属性为true ..在该主表单中,我创建了一个菜单,通过该菜单可以打开不同的子表单...

问题是如果用户点击菜单项,表单正在打开,因为我已创建其实例并在click事件中显示它。但是,如果一个子表单已经打开并且用户单击另一个表单,那么该表单也将打开..

在这种情况下,我想自动关闭以前的子表单。

以下是示例代码..

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()
}

所以这里两个表单都可以一次打开,但我希望前一个表单关闭,如果新的打开...一次一个表单..

请忽略语法和准时错误,因为它只是样本.. 请建议我做最好的方法!!!!

5 个答案:

答案 0 :(得分:3)

在MDI表单中创建以下函数。

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

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

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

答案 1 :(得分:1)

不是在click事件中声明窗口而是将它们设为全局。然后你要做的就是检查表单中的Visible属性。如果对于其他表单是正确的,那么您尝试打开的表单可以使用Close()方法。

答案 2 :(得分:1)

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

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();
            }
        }
    }
}

现在在你的函数中调用这个方法

  public void menu2_click(sender,e)
  {
    Helper.HideAllForms();
    Form2 objForm2 =New Form2();
    objForm2.Show();
  }

这对我来说很好,希望这对你也有用..

答案 3 :(得分:0)

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

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

Dim iobjForm1 As New Form1()
iobjForm1.ShowDialog()

和secode表格,

Dim iobjForm2 As New Form2()
iobjForm2.ShowDialog()

它会一次打开两个表单。

希望这会对你有所帮助。

答案 4 :(得分:0)

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

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