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

时间:2013-05-15 20:47:35

标签: c# winforms formclosing

我有一个包含关闭按钮的表单(表单中有很多控件,但我对关闭事件感到担心)和一个保存按钮。

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

然后我要确认在关闭表单之前单击了保存按钮(是否按下了关闭按钮或顶部的“X”按钮)。

但是如果该文本框中没有值或者表单刚刚初始化并且用户只想关闭表单,它只会关闭表单。如何执行此验证。

2 个答案:

答案 0 :(得分:1)

我会遵循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事件。

答案 1 :(得分:0)

进入Closing Event并使用EventHandler验证该文本框。请记住,关闭发生在表单关闭时(如果内存服务器正确),eventarg上有一个属性可以取消关闭表单。无论请求如何执行,都会引发此事件。