【问题标题】:Track closing event of windows form with validation of button clicked in the form通过验证表单中单击的按钮来跟踪 Windows 表单的关闭事件
【发布时间】:2013-05-16 13:04:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否熟悉创建属性或创建布尔值,以便在单击保存按钮时存储值并在关闭时首先检查该值..如果为真,则允许关闭表单,否则会提醒用户单击保存按钮,我认为应该在表单关闭事件中进行检查

标签: c# winforms formclosing


【解决方案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 事件。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 为什么不自己去探索呢?拉起窗口,拉起属性,切换到事件视图。然后玩它。
    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2017-12-25
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多