我有一个有趣的问题,我不知道该如何解决。我写了一个可以更改密码的表格。该表单还在一个只读的TextBox中显示当前密码(不是出于验证目的;在这种情况下这并不重要。)每个密码TextBox中都有一个按钮,单击该按钮时,会屏蔽或取消屏蔽密码(替换密码)字符和子弹,反之亦然。)这是整个图片:
请注意,“遮罩/取消遮罩”按钮是如何在文本框中而不是在文本框中的。这些按钮已放置在带有以下内容的文本框中:
var button = new Button();
button.Width = 20;
button.Cursor = Cursors.Default;
button.FlatStyle = FlatStyle.Flat;
button.Image = SystemIcons.Shield.ToBitmap();
button.Dock = DockStyle.Right;
button.CausesValidation = false;
textBox.Controls.Add(button);
最后一个文本框已启用验证。现在的问题是,由于验证事件失败,用户无法单击另一个文本框上的密码取消屏蔽按钮。因此,用户如果不输入新密码就无法看到当前密码。
我需要一种方法来使密码屏蔽/取消屏蔽按钮可单击,即使文本框中的验证失败。我什么都没想 不能将这些按钮移到文本框之外。
取消屏蔽按钮本身以及文本框的父级都CausesValidation
设置为false
。只有文本框本身将其设置为true
。
这是Visual Studio 2010中的.NET 2.0 C#项目。
好吧,我找到了一种方法,可以继续使用Validating事件,并且仍然能够单击其他文本框中的按钮。事实证明,即使按钮没有焦点,也会发送Button.MouseUp事件。
因此,解决方案是同时处理MouseUp和Click事件,并根据包含按钮的文本框当前是否具有键盘焦点来执行密码屏蔽/取消屏蔽:
button.MouseUp += (sender, e) =>
{
if (button.Parent.ContainsFocus || e.Button != MouseButtons.Left
|| !button.ClientRectangle.Contains(e.Location))
{
return;
}
textBox.UseSystemPasswordChar = !textBox.UseSystemPasswordChar;
};
button.Click += delegate
{
if (!button.Parent.ContainsFocus) {
return;
}
textBox.UseSystemPasswordChar = !textBox.UseSystemPasswordChar;
};
我们确实要处理这两个事件,因为如果只处理MouseUp,则用键盘单击按钮(Tab键切换到按钮,而Enter或Space键单击它)将不再起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句