隐藏所有打开的窗体

7

我有三个表单。

假设它们是A、B、C。

表单A打开表单B,然后表单B再打开表单C。

我在表单C中添加了一个名为隐藏所有打开的表单的按钮。

现在我该如何使用这个按钮隐藏所有三个表单?

我知道一种方法是使用ShowWindow Api,但我不想使用Api调用。

编辑: 感谢SoMoS

for (int i = Application.OpenForms.Count - 1; i >= 0; i += -1)
{
     if (!object.ReferenceEquals(Application.OpenForms[i], this))
     {
          Application.OpenForms[i].Hide();
     }
}
this.Hide();

或者

在A表单中(感谢ho1

B frm = new B();
frm.Owner = this;
frm.Show();

在B表单中
C frm = new C();
frm.Owner = this;
frm.Show();

在表单C的按钮点击事件中。
Owner.Owner.Hide();
Owner.Hide();
Hide();

感谢Wim Coenen,或者说由于他的帮助,这项技术得到了发展。
foreach (Form var in Application.OpenForms)
{
     var.Hide();
}

感谢您的选择。

3
很奇怪的是,你可以通过C#循环的编写方式立刻看出一个人是否是C++程序员。为什么不直接使用foreach (var form in Application.OpenForms) form.Hide();呢? - Wim Coenen
5个回答

7

您只需要访问此集合:

Application.OpenForms

然后您只需要遍历所有项目并隐藏您想要的项目(例如,您可以通过标题进行检查),或者隐藏所有项目。

希望这有所帮助。


3

这个有效:

Owner.Owner.Hide();
Owner.Hide();
Hide();

如果您不确定链中会有多少表单,您可以使用递归方法。

虽然这取决于A是否为B的所有者等等,但您可以通过在显示表单时将this作为参数发送到Show调用中来安排。


我不知道为什么会出现“对象引用未设置为对象实例”的错误。这只适用于Mdi表单吗? - Searock
如果您尝试调用一个对象的方法,而该对象为空,则会出现此错误,例如,如果表单没有所有者。 - Matt Ellen
表单没有所有者,因为它们不是对话框表单。必须使用其他方式。 - Ignacio Soler Garcia
@Matt Ellen,SoMoS,所以我应该创建一个Mdi窗体A和一个子窗体B,并将Mdi窗体B用于C。这样对吗? - Searock
1
@Searock:当你创建B时,将B的所有者设置为A,当你创建C时,将C的所有者设置为B。所有者是一个可读/可写属性。 - Matt Ellen

0

不必隐藏所有表单,您可以利用最小化一个表单会自动最小化其所有子表单的事实。因此,一旦C.Owner = B,B.Owner = A,您只需在A中的Click处理程序中使用:

WindowState = FormWindowState.Minimized

0

我在寻找刷新表单和执行点击操作,这样在关闭表单之前可以帮助我。

void formcheck()
{
    foreach (Form var in System.Windows.Forms.Application.OpenForms.OfType<Main>())
    {
        var.Hide();
    }
    Main notify = new Main();
    notify.Show();
    notify.btn_notify.PerformClick();
}

谢谢。


-2
Form2 NewForm = new Form2();
this.Hide(); //Hide Current form
NewForm..ShowDialog(); //Show new form
this.Show(); //Show Previous form After close new form

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