如何强制关闭按钮来终止所有子项?

时间:2012-08-09 05:48:32

标签: c# .net winforms

我有程序打开它内部的子窗口(mdi.parent)。我已经在其下的一个窗口中创建了组件,但是,我希望该窗口在创建之后从未实际处理过,因为我只想保留它的一个实例。

这可以通过代码来实现:

    // This prevents this window disposing from window close button, we want always show one and only
    // one instance of this window.
    FormClosing += (o, e) =>
                            {
                                Hide();
                                e.Cancel = true;
                            };

然而,在此之后出现问题,关闭程序需要按两次关闭按钮。首先关闭子窗口,然后第二个终止程序。如何解决这个问题?

我正在与Winforms合作。

5 个答案:

答案 0 :(得分:2)

正如Habib所说,你可以致电Application.Exit,但是:

  

Form.Closed和Form.Closing事件不会引发   调用Application.Exit方法退出应用程序

如果这对您很重要,您可以执行以下操作(MDI父代码):

    private Boolean terminating;

    protected override void OnClosing(CancelEventArgs e)
    {
        if (!terminating)
        {
            terminating = true;
            Close();
        }

        base.OnClosing(e);
    }

答案 1 :(得分:1)

在表单关闭事件中调用Application.Exit()

Application.Exit - MSDN

  

通知所有消息泵必须终止,然后关闭   消息处理完毕后的所有应用程序窗口。

答案 2 :(得分:0)

FormClosing事件处理程序方法中的代码有点过于简洁。它的作用是阻止用户关闭表单,但正如您也注意到的那样,它阻止以编程方式关闭表单。

通过测试每次引发事件时传递的CloseReason property FormClosingEventArgs的值,可以轻松解决这个问题。

这些将告诉您表单尝试关闭的原因。如果值为CloseReason.UserClosing,则您需要将e.Cancel设置为true并隐藏表单。如果值是其他值,那么您希望允许表单继续关闭。

// This prevents this window disposing when its close button is clicked by the
// user; we want always show one and only one instance of this window.
// But we still want to be able to close the form programmatically.
FormClosing += (o, e) =>
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            Hide();
            e.Cancel = true;
        }
    };

答案 3 :(得分:0)

使用此

       Form[] ch = this.MdiChildren;
       foreach (Form chfrm in ch)
       chfrm.Close();

答案 4 :(得分:-1)

如果应用程序关闭时没有发生处理,您可以使用Application.Exit。否则,您可以在MDI父级的结束事件中检查Application.OpenForms集合,并关闭所有其他已打开的表单。