通过窗体中单击按钮的验证来跟踪窗体的关闭事件

本文关键字:窗体 跟踪 事件 验证 单击 按钮 | 更新日期: 2023-09-27 18:13:40

我有一个包含关闭按钮的表单(表单中有许多控件,但我关心的是关闭事件)和保存按钮。

如果一个表单在某个文本框中有值(比如TextBox1),

然后我想验证在关闭表单之前是否单击了保存按钮(无论是关闭按钮还是按下顶部的"X"按钮)。

但是如果文本框中没有值或者窗体刚刚初始化,而用户只是想关闭窗体,它就会关闭窗体。如何执行此验证

通过窗体中单击按钮的验证来跟踪窗体的关闭事件

我会遵循99%的windows应用程序的模式:允许关闭窗口,但如果有任何更改,则要求保存更改。下面是该模式的一个简单实现:

private bool _hasChanges;
private void textBox1_TextChanged(object sender, EventArgs e)
{
    this._hasChanges = true;
}
private void form_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this._hasChanges)
    {
        var dialogResult = MessageBox.Show("Save changes?", "Confirm", MessageBoxButtons.YesNoCancel);
        switch (dialogResult)
        {
            case DialogResult.Yes:
                this.Save();
                break;
            case DialogResult.No:
                this._hasChanges = false;
                break;
        }
        e.Cancel = this._hasChanges;
    }
}
private void Save()
{
    // Save
    this._hasChanges = false;
}
private void buttonSave_Click(object sender, EventArgs e)
{
    this.Save();
}
private void buttonOk_Click(object sender, EventArgs e)
{
    this.Close();
}
private void buttonCancel_Click(object sender, EventArgs e)
{
    this._hasChanges = false;
    this.Close();
}

关键部分是布尔值_hasChanges。如果有许多控制可以导致变化,这可能是真正的痛苦。另一种方法是对实现INotifyPropertyChanged的类使用数据绑定,并订阅它的PropertyChanged事件。

绑定到关闭事件,并使用您的EventHandler来验证该文本框。请记住,关闭发生在窗体关闭的时候,并且(如果内存服务器正确的话)eventarg上有一个属性可以让您取消窗体的关闭。无论请求如何执行,都会引发此事件。