如何停止文本框离开事件触发窗体关闭

使用c#winforms vs2008

我在表单上有一个文本框,其中一个方法是从textBox1_Leave事件中调用的。 该方法获取有问题的文本框的内容,并根据内容填充其他文本框。 我的问题是用户关注文本框然后单击按钮关闭表单(调用this.close)然后表单不会关闭,因为文本框离开事件被触发。 如果文本框没有关注表单关闭,则表单关闭正常。

但是,如果用户通过单击顶角的小X关闭图标来关闭表单,则它会一直关闭,而不会触发文本框离开事件。

如何复制X关闭function,以便我可以在不触发文本框离开事件的情况下关闭表单?

最简单的解决方案是在进行后处理之前检查实际聚焦的控件 – 但是你不能在Leave处理程序中执行它,因为焦点仍然在那时的文本框上。

相反,您需要将逻辑移动到LostFocus事件,而不是设计器中的事件。 你必须在运行时连接它:

 public class Form1 : Form { public Form1() { InitializeComponent(); textBox1.LostFocus += new EventHandler(textBox1_LostFocus); } private void textBox1_LostFocus(object sender, EventArgs e) { if (closeButton.Focused) return; // Update the other text boxes here } } 

LostFocus事件在新控件获得焦点触发。

澄清 – 您可能会发现它的工作原理是将此逻辑放在Leave事件中 – 如果鼠标更改了焦点 。 如果改用键盘,你会得到错误的行为。 LostFocus两种情况下都是可靠的 – 聚焦控制将永远是“新”控制。 这在MSDN上记录: Windows窗体中的事件顺序 。

顺便说一句,你没有遇到“红色X”这个问题的原因是X实际上不是一个可以获得焦点的控件,它是窗口的一部分。 当用户单击它时,它不会导致文本框失去焦点,因此不会导致Leave事件触发。

另一种方法:使用文本框的validation事件而不是它的离开事件,然后将按钮的CausesValidation属性更改为false。 您还必须将文本框设置为不在按钮的单击事件中进行validation,以便在表单关闭时不会触发validation事件(感谢@Powerlord指出这一点)。

 private void button1_Click(object sender, EventArgs e) { this.textBox1.CausesValidation = false; this.Close(); } 

您还可以处理FormClosing事件,并确保e.Cancel参数不会通过窗体上其他控件上的validation事件设置为true。 我认为它们将在FormClosing事件之前被解雇。

  private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = false; return; } } 

你可以查看哪个控件刚关注。

 private void textBox1_Leave(object sender, EventArgs e) { if (btnClose.Focused) return; // go from here } 

只检查拥有文本框的表单是否正在处理? 如果它被关闭,它就会被处理掉。 如果它处理你可以简单地结束讨厌的’离开’事件而不做任何事情。 我没有检查它并原谅我,我对自己的项目感到窒息,所以我正在寻找自己,所以我认为我没有时间。

 private void GuiltyTextBox_Leave(object sender, EventArgs e) { Form formOwningTheTextBox=(Form)((Control)sender).TopLevelControl; if (formOwningTheTextBox.Disposing || formOwningTheTextBox.IsDisposed) return; ....... } 

我只相信这会以最小的努力工作,并希望在我继续搜索我自己的答案之前发送快速答案。

在文本框中写下面的代码行将事件放在最上面

 if me.closing then return end if