首先,我强烈非常建议您尝试说服您的客户放弃此要求。对于程序员和的最终用户来说,蒙面文本框通常是一件非常痛苦的事情。在我看来,如果您必须格式化用户输入,那么在控件失去焦点后 格式化他们输入的任何内容要比尝试格式化他们的输入而 要好得多。还在打字。
无论采用哪种方法,最简单的方法是创建您自己的用户控件(除非您想使用第三方控件,出于多种原因我不建议为此目的),该控件继承自TextBox(而不是从 UserControl 继承)。如果您希望在用户完成输入并移至另一个控件后格式化文本,您可以在控件的 LostFocus 事件中添加一个 EventHandler 并在那里格式化他们的输入。
但是,如果您希望在他们键入时进行格式化,那么您有几个可怕的选择。首先,您可以处理控件的 KeyPress 或 KeyDown 事件,并截取并取消非数字字符,或者此时格式化整个 Text 属性。这是一种常见的方法,但通常会以意想不到的方式失败,因为它最终不会处理复制并粘贴到控件中的文本(这在数据输入应用程序中经常发生)。
另一种方法是处理 TextChanged 事件,该事件将响应键盘输入和粘贴的文本,并即时重新格式化文本。由于您经常在键入文本时更改文本,因此您的代码需要注意 SelectionStart 属性(以及其他属性),以免在用户键入时意外更改插入符号的位置。此外,当您在格式化时更改控件的文本属性时,此更改本身会产生另一个 TextChanged 事件,因此您需要注意不要陷入无限循环。
重申我的主要观点,在 LostFocus 事件中格式化会更开心,最终用户也会如此。
编写控件后,只需在代码中进行全局替换,将“TextBox”替换为“MyMaskedTextBox”(此处建议区分大小写)。
更新:这里有一些简单的解析/格式化代码,您可以在 TextBox 的 LostFocus 事件中使用:
double d;
TextBox tb = (TextBox)sender;
if (double.TryParse(tb.Text, out d))
{
tb.Text = d.ToString("#,###,###,###.0000");
tb.BackColor = SystemColors.Window;
}
else
{
tb.BackColor = Color.Red;
}
如果输入的文本可以解析为双精度,则此代码将按照您需要的方式将用户的输入格式化为数字。如果输入不是有效的双精度,则文本保持原样,BackColor 更改为红色。这是向用户指示无效输入的好方法(与弹出消息框相反)。