停止发送Leave事件的TextChanged事件

时间:2011-09-22 17:49:03

标签: c# winforms

我正在为公立学校开发一个简单的WinForms应用程序,用户可以通过输入他们的网络ID(受保护的信息)或他们的系统ID()来识别自己。 受保护的信息)。我想在程序检测到系统ID时切换到密码字符(工作正常);但是,当我这样做时,我的应用程序还会触发文本框的Leave事件,该事件告诉用户在出现问题之前修复登录数据的问题。

这是我的代码:

void login_TextChanged(object sender, EventArgs e)
{
    login.UseSystemPasswordChar = login.Text.StartsWith(<prefix-goes-here>);
}

private void login_Leave(object sender, EventArgs e)
{
    if (login.Text.StartsWith(<prefix-goes-here>) && login.Text.Length != 9)
    {
        signInError.SetError(login, "Your System ID must be nine digits.");
        login.BackColor = Color.LightPink;
    }
    else if (login.Text.IsNullOrWhiteSpace())
    {
        signInError.SetError(login, "Please enter your username or System ID.");
        login.BackColor = Color.LightPink;
    }
    else
    {
        signInError.SetError(login, string.Empty);
        login.BackColor = Color.White;
    }
}

最终,我不知道这会导致大量问题,我可以将此验证步骤移至我表单上登录按钮的Click事件,但我会而是在可能的情况下逐个进行验证。

3 个答案:

答案 0 :(得分:2)

将TextBox放在GroupBox中会重现这种行为 - 这很奇怪。

如果你想保留你的GroupBox,这是一个解决方法:

private void login_TextChanged(object sender, EventArgs e)
{
  login.Leave -= login_Leave;
  login.UseSystemPasswordChar = login.Text.StartsWith(<prefix-goes-here>);
  login.Leave += login_Leave;
}

答案 1 :(得分:1)

无论出于何种原因,登录Leave位于TextBox控件内时,GroupBox事件都会触发。使用简单的GroupBox控件替换Label会阻止TextChanged事件中的代码触发Leave事件。

答案 2 :(得分:0)

是的,这是UseSystemPasswordChar属性的一个怪癖。它是在创建本机编辑控件时必须指定的属性(ES_PASSWORD)。更改它需要Winforms销毁该本机控件并重新创建它。这有副作用,其中之一是焦点不能停留在文本框上,因为窗口消失了。 Windows将触发WM_KILLFOCUS通知。

在GroupBox中确实是一个必要的组成部分,Winforms在收到通知时不会抑制Leave事件。错误。

许多可能的修复。您可以设置一个标志,Leave事件处理程序可以检查它是否是由更改属性引起的。