我正在为公立学校开发一个简单的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事件,但我会而是在可能的情况下逐个进行验证。
答案 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事件处理程序可以检查它是否是由更改属性引起的。