0

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

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

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

在那种情况下,我想自动关闭以前的子窗体..

下面是示例代码..

public void menu1_click(sender,e)
{
  Dim objForm1 As New Form1()
  objForm1.ShowDialog()
}

而对于码表,

public void menu2_click(sender,e)
{
Dim objForm2 As New Form2()
objForm2.ShowDialog()
}

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

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

4

6 回答 6

3

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

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

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

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

于 2012-07-27T07:57:53.043 回答
1

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

于 2012-07-27T07:46:18.110 回答
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();
  }

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

于 2012-07-27T08:06:56.670 回答
0

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

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

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

而对于码表,

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

它将一次打开两个表格。

希望这会帮助你。

于 2012-07-27T07:28:53.947 回答
0

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

于 2012-07-27T07:45:56.373 回答
0

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

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

于 2012-07-27T08:25:04.730 回答