如何防止窗体关闭时控件中的事件被触发

5
我的问题是,我在Leave事件中验证一个TextBox,并检查这个TextBox是否有内容。如果这个TextBox中的文本为零,则会出现一个MessageBox,但如果表单正在关闭且焦点在此TextBox中,则会出现MessageBox,因为此时TextBox没有任何内容。
如何避免在表单关闭时在Leave事件中进行验证?
3个回答

6
你需要重写表单上的 OnFormClosing 方法,并设置一个标志,让你知道表单正在关闭。然后,在验证时,首先检查该标志。
请确保在调用 base 之前设置标志。
protected override void OnFormClosing(FormClosingEventArgs e)
{
    _isClosing = true;

    base.OnFormClosing(e);
}

我想尝试这个,但是我该如何分配覆盖此事件的_isClosing变量?_isClosing是我需要验证的标志吗? - José Gordillo López
@JoséGordilloLópez,请查看我的更新(我将virtual更改为override)。此外,_isClosing是类变量private bool _isClosing;,您将设置它以让窗体知道它正在关闭。然后在Leave事件中,您将执行以下操作:if (_isClosing) { return; }以取消验证。 - Mike Perrenoud
谢谢,这个工作得非常好。对于其他用户,也感谢。 - José Gordillo López
您可以通过使用验证事件而不是离开事件来进行验证,从而避免这种情况的发生。 - Stuart Helwig

4

一种方法是取消文本框引发的事件。我不确定你是如何验证的,但你可以尝试在 FormClosing 事件中将 Enabled 属性设置为 false。

private void Form1_FormClosing(Object sender, FormClosingEventArgs e) 
{        
    myTextBox.Enabled = false; 
}

或者移除Leave事件处理程序。

private void Form1_FormClosing(Object sender, FormClosingEventArgs e) 
{       
    myTextBox.Leave -= myTextBox_Leave;
}

1
使用文本框的“validated”事件来实现,而不是使用“leave”事件。这将确保您的代码在表单关闭之前执行,并应精确地实现您所需的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接