今天跟大家唠唠我搞 MaskedTextBox 的那些事儿,这玩意儿说难不难,说简单也不简单,反正我踩不少坑,就当是给大家避坑。
老板甩给我一个需求,说要搞一个能限制用户输入格式的文本框,比如电话号码、IP 地址啥的。我想这还不简单,TextBox 控件直接上呗。结果,试半天,发现这玩意儿只能输入文本,没法限制格式!
上网一搜,才发现有个叫 MaskedTextBox 的控件,专门干这个的。这下可好,赶紧拽到 WinForm 窗体里,开始摆弄。
就是那个 Mask 属性,这玩意儿是 MaskedTextBox 的灵魂!查半天资料,总算搞清楚几个常用的掩码:
- 0:必须输入一位数字(0-9)。
- 9:可以输入一位数字(0-9),也可以不输入。
- #:可以输入一位数字(0-9)或加减号(+、-),也可以不输入。
- L:必须输入一个字母(A-Z、a-z)。
- ?:可以输入一个字母(A-Z、a-z),也可以不输入。
- &:必须输入一个字符。
- C:可以输入任意字符,也可以不输入。
- A:必须输入一个字母或数字。
- a:可以输入一个字母或数字,也可以不输入。
- .:小数点占位符。实际显示的小数点字符取决于应用程序的区域设置。
- ,:千位分隔符。实际显示的千位分隔符字符取决于应用程序的区域设置。
- ::时间分隔符。实际显示的时间分隔符字符取决于应用程序的区域设置。
- /:日期分隔符。实际显示的日期分隔符字符取决于应用程序的区域设置。
- $:货币符号。实际显示的货币符号字符取决于应用程序的区域设置。
比如说,我要搞一个电话号码的格式,可以这样写:Mask = "000-0000-0000"。这样用户就只能输入数字,而且会被自动格式化成 XXX-XXXX-XXXX 的形式。挺方便的?
但是!问题来!那个下划线,看着贼难受!就是你没输入东西的时候,它会显示一堆下划线占位符。这玩意儿怎么去掉?
又是一顿搜,发现有个 PromptChar 属性,可以设置占位符。默认是下划线,改成空格就行:PromptChar = ' '。
还有一个 AllowPromptAsInput 属性,默认是 true。这个属性是控制是否允许用户输入 PromptChar 作为有效字符的。如果设置成 false,用户就不能输入空格。
搞完这些,基本就差不多。但是,又遇到一个坑!
有些时候,我们需要在代码里获取 MaskedTextBox 的值。但是,直接用 Text 属性获取到的值,可能会包含占位符。比如,用户只输入 "123-",Text 属性的值可能是 "123-____-____"。这可不行!
后来发现,可以用 TextMaskFormat 属性来控制返回值的格式。可以设置成 IncludeLiterals、ExcludeLiterals、IncludePrompt 或 ExcludePrompt。IncludeLiterals 会包含掩码中的分隔符,ExcludeLiterals 会排除分隔符,IncludePrompt 会包含占位符,ExcludePrompt 会排除占位符。根据自己的需求选择合适的格式就行。
比如,我想要只获取用户输入的内容,不要任何分隔符和占位符,可以这样写:* = *; string value = *;
再说说事件处理。MaskedTextBox 也有一些常用的事件,比如 TextChanged、Validating、Validated 等。可以利用这些事件,实现一些更复杂的功能,比如实时验证用户输入、自动填充数据等。
MaskedTextBox 看起来简单,用起来还是有一些坑的。希望我这回的分享,能帮大家少走一些弯路。
- Mask 属性是灵魂,要好好研究。
- PromptChar 属性可以去掉难看的下划线。
- AllowPromptAsInput 属性控制是否允许输入占位符。
- TextMaskFormat 属性控制返回值格式。
- 利用事件处理,可以实现更复杂的功能。
就说这么多,溜溜!