C# TextBox.Enter()事件在WinForm中触发TextBox.Leave()事件
我正在用C#的WinForms制作注册表单。 我在不同的C# TextBox.Enter()事件在WinForm中触发TextBox.Leave()事件,c#,winforms,visual-studio-2019,C#,Winforms,Visual Studio 2019,我正在用C#的WinForms制作注册表单。 我在不同的TexBox.Enter() 和TexBox.Leave()事件 private void EnterBox(TextBox Box, string Text, PictureBox PicBox, Bitmap Pic, Label WarningLabel) { if ((Box.Text == Text) && (Box.TextAlign == HorizontalAlignment.Center))
TexBox.Enter()
和TexBox.Leave()
事件
private void EnterBox(TextBox Box, string Text, PictureBox PicBox, Bitmap Pic, Label WarningLabel)
{
if ((Box.Text == Text) && (Box.TextAlign == HorizontalAlignment.Center))
{
Box.Clear();
if (Box == PassBox)
Box.UseSystemPasswordChar = true;
Box.TextAlign = HorizontalAlignment.Left;
}
PicBox.BackgroundImage = Pic;
WarningLabel.ForeColor = Color.FromArgb(34, 36, 49);
Box.ForeColor = Color.FromArgb(78, 184, 206);
}
private void LeaveBox(TextBox Box, string Text, PictureBox PicBox, Bitmap Pic, Label WarningLabel)
{
if (Box.Text == "")
{
if (Box == PassBox)
Box.UseSystemPasswordChar = false;
WarningLabel.ForeColor = Color.Red;
Box.Text = Text;
Box.TextAlign = HorizontalAlignment.Center;
Box.ForeColor = Color.Gray;
}
else
{
if (!Regex.IsMatch(Box.Text, (string)Box.Tag))
WarningLabel.ForeColor = Color.Red;
Box.ForeColor = Color.White;
}
PicBox.BackgroundImage = Pic;
Box.Select(0, 0); // Move the Cursor to Start.
}
它似乎可以很好地处理其他文本框,但不能很好地处理PassBox
private void PassBox_Enter(object sender, EventArgs e)
{
EnterBox(PassBox, "Password", PasswordPic, Properties.Resources.password__2_, PasswordWarningLabel);
}
private void PassBox_Leave(object sender, EventArgs e)
{
LeaveBox(PassBox, "Password", PasswordPic, Properties.Resources.password, PasswordWarningLabel);
}
使用VS-Studio-2019
调试它时,我会在完成测试后输入PassBox\u enter()
的EnterBox()
显示
if ((Box.Text == Text) && (Box.TextAlign == HorizontalAlignment.Center))
{
Box.Clear();
if (Box == PassBox)
Box.UseSystemPasswordChar = true;
Box.TextAlign = HorizontalAlignment.Left;
}
它进入PassBox\u Leave()
并执行它,然后再次进入PassBox\u Enter()
并再次执行该函数
我工作得很好,但突然它开始这样做了。
我试图删除以前的TexBox并再次生成另一个box,但它又开始这样做。我认为问题出在前面
if (Box == PassBox)
Box.UseSystemPasswordChar = true;
在输入框中
方法。调用Box.UseSystemPasswordChar=true时代码>将文本框
设置为受限模式(可以在“重要信息”下阅读)。当文本框
处于受限模式时,它将失去焦点,并且将抛出PassBox\u Leave
事件。这就是调试按照您描述的方式运行的原因
如果要确保在调用PassBox\u Leave
之前完成输入的PassBox\u事件,必须确保EnterBox
中没有代码行从TextBox
切换焦点。这是当前由行Box.UseSystemPasswordChar=true代码>在输入框中
但是,它们是通过例如布尔标志来规避此问题的方法。这个解决方案可能不是最优的,但应该有效
因为PassBox\u Leave
可以由Box.UseSystemPasswordChar=true
(当您不希望执行LeaveBox
中的任何内容时)或当用户离开TextBox
(当您希望执行LeaveBox
时),您可以在类中使用布尔标志,并在Box.UseSystemPasswordChar=true行之前将其设置为true
执行输入框中的code>。然后在LeaveBox
的第一行中检查布尔标志是否为true
,如果为true,则返回,因此将不会执行LeaveBox
中的任何内容(但是仍然会调用PassBox\u Leave
,因此这可能不是最佳解决方案)
因此,当Box.UseSystemPasswordChar=true时,程序基本上仍将进入LeaveBox
代码>已执行,但它将很快返回,因为该标志已设置为true。当用户离开TextBox
时,标志将为false,并且LeaveBox
将按预期执行。我认为问题就在这一行
if (Box == PassBox)
Box.UseSystemPasswordChar = true;
在输入框中
方法。调用Box.UseSystemPasswordChar=true时代码>将文本框
设置为受限模式(可以在“重要信息”下阅读)。当文本框
处于受限模式时,它将失去焦点,并且将抛出PassBox\u Leave
事件。这就是调试按照您描述的方式运行的原因
如果要确保在调用PassBox\u Leave
之前完成输入的PassBox\u事件,必须确保EnterBox
中没有代码行从TextBox
切换焦点。这是当前由行Box.UseSystemPasswordChar=true代码>在输入框中
但是,它们是通过例如布尔标志来规避此问题的方法。这个解决方案可能不是最优的,但应该有效
因为PassBox\u Leave
可以由Box.UseSystemPasswordChar=true
(当您不希望执行LeaveBox
中的任何内容时)或当用户离开TextBox
(当您希望执行LeaveBox
时),您可以在类中使用布尔标志,并在Box.UseSystemPasswordChar=true行之前将其设置为true
执行输入框中的code>。然后在LeaveBox
的第一行中检查布尔标志是否为true
,如果为true,则返回,因此将不会执行LeaveBox
中的任何内容(但是仍然会调用PassBox\u Leave
,因此这可能不是最佳解决方案)
因此,当Box.UseSystemPasswordChar=true时,程序基本上仍将进入LeaveBox
代码>已执行,但它将很快返回,因为该标志已设置为true。当用户离开TextBox
时,该标志将为false,并且LeaveBox
将按预期执行。as@Hans Passant和@said更改UseSystemPasswordChar
每次触发PassBox\u Leave()
事件。我删除了if(Box==PassBox)Box.UseSystemPasswordChar=true
和如果(Box==PassBox)Box.UseSystemPasswordChar=false代码>来自LeaveBox()
和EnterBox()
并更新了PassBox\u Enter()
和PassBox\u Leave()
,如下所示
private void PassBox_Enter(object sender, EventArgs e)
{
if (PassBox.TextAlign == HorizontalAlignment.Center)
PassBox.UseSystemPasswordChar = true;
EnterBox(PassBox, "Password", PasswordPic, Properties.Resources.password__2_, PasswordWarningLabel);
}
及
它仍然会触发PassBox\u Leave()
,但会起作用。因为@Hans Passant和@said每次更改UseSystemPasswordChar
都会触发PassBox\u Leave()
事件。我删除了if(Box==PassBox)Box.UseSystemPasswordChar=true
和如果(Box==PassBox)Box.UseSystemPasswordChar=false代码>来自LeaveBox()
和EnterBox()
并更新了PassBox\u Enter()
和PassBox\u Leave()
,如下所示
private void PassBox_Enter(object sender, EventArgs e)
{
if (PassBox.TextAlign == HorizontalAlignment.Center)
PassBox.UseSystemPasswordChar = true;
EnterBox(PassBox, "Password", PasswordPic, Properties.Resources.password__2_, PasswordWarningLabel);
}
及
它仍然会触发PassBox\u Leave()
,但它会工作。UseSystemPasswordChar属性是一个“困难”属性,它需要Winforms