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

时间:2010-02-26 03:46:36

标签: c# winforms textbox events

使用c#winforms vs2008

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

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

如何复制X关闭功能,以便我可以随时关闭表单而不会触发文本框离开事件?

6 个答案:

答案 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