使用c#winforms vs2008
我在表单上有一个文本框,其中一个方法是从textBox1_Leave事件中调用的。该方法获取有问题的文本框的内容,并根据内容填充其他文本框。 我的问题是,用户是否专注于文本框,然后单击按钮关闭表单(调用this.close),然后表单不会关闭,因为文本框离开事件被触发。 如果文本框没有关注表单关闭,那么表单就会正常结束。
但是,如果用户通过单击顶角的小X关闭图标来关闭表单,则它会一直关闭,而不会触发文本框离开事件。
如何复制X关闭功能,以便我可以随时关闭表单而不会触发文本框离开事件?
答案 0 :(得分:7)
最简单的解决方案是在进行后期处理之前检查实际聚焦的控件 - 但是你不能在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
}
}
{/ 1}}事件恰好在新控件获得焦点后触发。
澄清 - 您可能通过将此逻辑放入LostFocus
事件 - ,如果鼠标改变了焦点< / strong>即可。如果使用键盘,你将得到错误的行为。 两个情况下Leave
都是可靠的 - 集中控制总是是“新”控件。这在MSDN上有记录:Order of Events in Windows Forms。
顺便说一句,你没有遇到“红色X”这个问题的原因是X实际上不是一个可以获得焦点的控件,它是窗口的一部分。当用户点击它时,它不会导致文本框失去焦点,因此不会导致LostFocus
事件触发。
答案 1 :(得分:2)
另一种方法: 使用文本框的验证事件而不是它的leave事件,然后将按钮的CausesValidation属性更改为false。您还必须将文本框设置为不在按钮的单击事件中进行验证,以便在表单关闭时不会触发验证事件(感谢@Powerlord指出这一点)。
private void button1_Click(object sender, EventArgs e)
{
this.textBox1.CausesValidation = false;
this.Close();
}
答案 2 :(得分:2)
您还可以处理FormClosing事件,并确保通过窗体上其他控件上的验证事件将e.Cancel参数设置为true。我认为它们将在FormClosing事件之前被解雇。
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = false;
return;
}
}
答案 3 :(得分:0)
你可以查看哪个控件刚关注。
private void textBox1_Leave(object sender, EventArgs e)
{
if (btnClose.Focused)
return;
// go from here
}
答案 4 :(得分:0)
只检查拥有文本框的表单是否正在处理?如果它被关闭,它将被处置。如果它处理你可以简单地结束讨厌的离开&#39;事情没有做任何事情。我没有检查并原谅我,我对自己的项目感到窒息,所以我正在寻找自己,所以我不认为我会有时间。< / p>
private void GuiltyTextBox_Leave(object sender, EventArgs e) {
Form formOwningTheTextBox=(Form)((Control)sender).TopLevelControl;
if (formOwningTheTextBox.Disposing || formOwningTheTextBox.IsDisposed) return;
.......
}
我只相信这会以最小的努力工作,并希望在我继续寻找自己的答案之前发送快速答案。
答案 5 :(得分:0)
在文本框中编写以下代码行,将事件保留在顶部
if me.closing then
return
end if