gpt4 book ai didi

c# - OnFormClosing 和 e.CloseReason

转载 作者:太空宇宙 更新时间:2023-11-03 23:34:56 24 4
gpt4 key购买 nike

我有一个表单,上面有两个按钮“取消”和“确定”。在“取消”按钮的处理程序中,我执行任何我需要执行的回滚操作,然后调用 this.Close()。在“确定”按钮的处理程序中,我做我需要做的任何提交,然后调用 this.Close()

所以我现在意识到用户也可以单击表单右上角的“X”图标来关闭表单。我应该像对待“取消”按钮一样对待它,但我无法覆盖“X”按钮。我能做的最好的事情就是为 OnFormClosing 事件添加一个处理程序。

不过,我仍然很困惑,不确定处理这个问题的最佳方法是什么。还有许多其他原因可以关闭表单(例如 ALT-F4 或 Windows 关闭)我想将所有这些都视为“取消”按钮。

但是,我是通过单击“X”、“关闭”(最终调用 this.Close())还是“确定”(最终也调用 this. Close()),e.CloseReason 的值是相同的(UserClosing),sender 的值也是一样,所以我无法区分。

如果表单因单击“确定”按钮以外的任何原因关闭,实现回滚的最佳方法是什么?

最佳答案

您只需要在您的 OK 按钮处理程序中设置一个 bool 值,并在您的 OnFormClosing() 覆盖中检查该 bool 值,如下所示:

public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}

protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);

if (!this.isClosingViaOkButton)
{
// ...do your rollback here.

MessageBox.Show("Rolling back");
}
}

private void okButton_Click(object sender, EventArgs e)
{
// ...do your committing here.

this.isClosingViaOkButton = true;
this.Close();
}

private bool isClosingViaOkButton;
}

作为替代方案,您可以在 OnFormClosing() 中执行这两项操作,而不是在 OK 按钮处理程序中提交并在 OnFormClosing() 中回滚,如下所示:

protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);

if (this.isClosingViaOkButton)
{
// ...do your committing.
}
else
{
// ...do your rollback.
}
}

我自己更喜欢这种方法。

关于c# - OnFormClosing 和 e.CloseReason,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30892093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com