我有一个包含关闭按钮的表单(表单中有很多控件,但我担心关闭事件)和一个保存按钮。
如果表单在某个文本框(比如 TextBox1)中有值,
然后我想验证在关闭表单之前是否单击了保存按钮(无论是关闭按钮还是顶部的“X”按钮被按下)。
但是,如果该文本框中没有值或表单刚刚初始化并且用户只想关闭表单,则它只是关闭表单。如何执行此验证。
我有一个包含关闭按钮的表单(表单中有很多控件,但我担心关闭事件)和一个保存按钮。
如果表单在某个文本框(比如 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();
}
关键部分是 boolean _hasChanges
。如果有许多控件可以导致更改,这可能是真正的痛苦。另一种方法是对实现INotifyPropertyChanged
和订阅其PropertyChanged
事件的类使用数据绑定。
绑定到关闭事件并使用您的 EventHandler 来验证该文本框。请记住,关闭发生在表单关闭时,并且(如果内存服务器正确)eventarg 上有一个属性可以让您取消关闭表单。无论请求如何执行,都会引发此事件。