【问题标题】:Setting programmatically closereason以编程方式设置 closereason
【发布时间】:2009-12-28 17:05:09
【问题描述】:

我想在表单内部调用 This.Close() 后设置表单的 CloseReason。

通常,此表单通过调用 This.Close() 自行关闭,但我想询问用户是否真的要关闭表单,并发送包含一些信息的 mbox。但我有这个:

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
        base.OnFormClosing(e);
    }

但是每次我调用 This.Close(); CloseReason 始终是 UserClosing。

我可以在通话后设置它还是我必须处理不同的 OnFormClosing?

【问题讨论】:

  • 顺便说一句:MessageBox.show() 不完整,因为我在这里写的,而不是在 VS 中
  • 我还发现调用 Form.Close() 的 CloseReason 似乎总是 UserClosing。这有点傻,因为 UserClosing 应该只在用户点击关闭按钮、从系统菜单中选择关闭或 Alt+F4 的表单时才会出现。

标签: c# winforms


【解决方案1】:

而不是创建额外的变量:

appClosing = true; 
this.Close();

您可以致电:

Application.Exit();

然后 e.CloseReason 将等于

CloseReason.ApplicationExitCall

这可能是你所追求的。

【讨论】:

  • 很好,谢谢!太糟糕了,这个项目已经完成了(这是为了大学工作)。但是真的很高兴知道
【解决方案2】:

我不认为你可以这样做,我总是做的是使用标志

appClosing = true;
this.Close();

然后检查一下:

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing && !appClosing)
        {
            if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
        base.OnFormClosing(e);
    }

【讨论】:

  • 似乎是唯一的选项...它现在正在按我想要的方式工作,所以我会保持这种状态...谢谢!
【解决方案3】:

我开始这样做的方法是根据用户在表单上单击的内容将表单的 DialogResult 属性设置为不同的东西。

在您的按钮单击方法中:

private void FillOrder_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.OK;
    // this.Close() is called automatically when you set DialogResult
    // so the above line will close the form as well.
}

这样您可以在 FormClosing 方法中执行以下操作:

private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
    switch (e.CloseReason)
    {
        case CloseReason.UserClosing:
            switch (this.DialogResult)
            {
                case DialogResult.OK:
                    // User has clicked button.
                    break;
                case DialogResult.Cancel:
                    // User has clicked X on form, show your yes/no/cancel box here.

                    // Set cancel here to prevent the closing.
                    //e.Cancel = true;
                    break;
            }
            break;
    }
}

就 CloseReason 始终设置为 UserClosing 而言,它通过用户可以启动的任何操作设置为该值,不记得确切是什么,但我很确定即使是任务管理器强制杀死是用户关闭.但是,我可以确认在各种情况下设置了其他枚举值,例如在应用程序仍在运行时关闭/重新启动。您甚至可以通过在开关中捕获所有关闭原因并取消关闭来停止窗口关闭。

【讨论】:

  • 可能是最好的答案。在处理取消或强制退出时,关闭代码将使用类似:e.Cancel = this.DialogResult != DialogResult.Cancel && 'other domain conditions';
  • 太棒了。谢谢!
【解决方案4】:

CloseReason 是一个具有以下成员的枚举:

None
WindowsShutDown
MdiFormClosing
UserClosing
TaskManagerClosing
FormOwnerClosing
ApplicationExitCall

这让我相信它通常取决于与表单行为相关的条件(例如,关闭父表单会关闭它的子表单)。因此,为了让 arg 说出 CloseReason.ApplicationExitCall,该事件必须从 Application.Exit 调用中触发。

与 CloseReason.FormOwnerClosing 相同,假设您的子表单是使用 form.Show(Parent) 调用的

如果您的目标是简单地获得有关表单关闭原因的额外信息,您可以简单地将其作为公共属性或属性存储在表单对象中,以便稍后访问它,假设所述表单没有被释放。

提供您更改 CloseReason 的动机可能也会有所帮助。

CloseReason msdn 页面供参考 http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 2018-11-26
    • 2011-04-18
    • 2012-07-18
    • 2016-02-15
    • 2014-07-26
    • 1970-01-01
    • 2011-06-06
    • 2012-02-12
    相关资源
    最近更新 更多