【发布时间】:2011-09-23 02:41:26
【问题描述】:
我正在为一所公立学校开发一个简单的 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 事件,但我会如果可能的话,而是逐个进行验证。
【问题讨论】:
-
这对我来说也没有任何意义。我在 Visual Studio 中检查了调用堆栈,它显示 login_TextChanged 已调用 login_Leave。我已经多次检查设计器以确保没有与事件相关的其他任何东西,清理并重建了应用程序,但它仍然会发生。
-
好的,看来关键细节——我忽略了,不知道这是一个关键细节——是这个 TextBox 控件位于 GroupBox 控件内。我将 TextBox 移到 GroupBox 控件之外,这些事件按预期触发。在 GroupBox 内部,它的作用与我上面描述的一样。