以编程方式设置closereason

时间:2009-12-28 17:05:09

标签: c# winforms

我想在表单中调用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?

4 个答案:

答案 0 :(得分:12)

而不是创建额外的变量:

appClosing = true; 
this.Close();

您可以致电:

Application.Exit();

然后e.CloseReason将等于

CloseReason.ApplicationExitCall

你可能会追求的是什么。

答案 1 :(得分:11)

我认为你不能这样做,我一直在做的是使用旗帜

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

答案 2 :(得分:9)

我开始这样做的方法是根据用户在表单上点击的内容将表单的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而言,它被用户可以启动的任何动作设置为该值,不能完全记住什么,但我很确定即使任务管理器强制终止也是用户关闭。但是我可以确认在各种情况下设置其他枚举值,例如在应用程序仍在运行时关闭/重启。您甚至可以通过在开关中捕获所有关闭原因并取消关闭来停止关闭窗口。

答案 3 :(得分:5)

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

相关问题