用 MaskedTextBox 代替 DateTimePicker,使支持空白值

DateTimePicker 总会显示一个时间,但实际应用中,我们可能允许用户不填时间,怎么解决呢?

一种方法是指定 DateTimePicker 的 ShowCheckBox 属性为 true,这样在日期框前部就有一个多选框:选中了,则表示时间有效;没选中,可表示用户没有填。用 Checked 属性来判断是否选中。

但本文要用另一种更好的方法来解决,用 MaskedTextBox。

拖入一个 MaskedTextBox,然后将其 Mask 属性设置为“0000年90月90日”:0 表示必须填一个数字,9 表示可以填一个数字,也可以不填。运行时显示为“____年__月__日”,其中我们填的时候,只可在下划线的地方填数字,有点点像 IP 地址框,但没 IP 地址框方便的是:这个回退字符时,会影响后面区段的跟着往前跑。

这事没完

但是我们可以录入任何数字,比如月份录入 13,这显示不对了,就需要在取值之前由我们的程序来判断了。

批判“0000年90月90日”

由前可知,0 表示必填数字,也就是说月必须是“02月”或“_2月”,不能是“2_月”,日也是如此。

这显然不是很方便,用户期望不管填在前面还是后面,只要是填在月上,都行。

所以把“0000年90月90日”改为“0000年99月99日”。

判断用户填错了,还是没填

上面的代码,只是判断用户填了正确的时间没有,如果上面 if 为 false,则不知道用户填错了,还是没填。所以,上面的代码实际上是要求用户必填日期,目的是防范用户没有填日期,使用了默认的日期

要判断用户填错了,还是没填,得辅助使用 Text,Text 属性值与 MaskedTextBox 的 TextMaskFormat 值有关:

  • ExcludePromptAndLiterals 不包含下划线和原义字符(比如年月日)
  • IncludeLiterals 包含原义字符(比如年月日),默认值
  • IncludePrompt 包含下划线
  • IncludePromptAndLiterals 包含下划线和原义字符(比如年月日)

还有个问题,没有填的时候,那些空起的地方,Text 如何对待之?

  • ExcludePromptAndLiterals 在填的最后一个字符之前的下划线,都将以空格的形式给 Text,后面的就不要了。比如填出来是这个样子“__3_年_4月__日”,那么 Text 将包含 3 前面的空格、4 前面的空格,4 后面的空格就不管了。
  • IncludeLiterals 在最后一个字符(本示例中为日)之前的下划线,都将以空格的形式给 Text,后面的就不要了。
  • IncludePrompt 所有没填的地方(下划线的地方),都以下划线返回。
  • IncludePromptAndLiterals 所有没填的地方(下划线的地方),都以下划线返回。

所以我们可以设置 TextMaskFormat 为 IncludePromptAndLiterals,如果 Text 为“____年__月__日”,则表示没有填。

你可能感兴趣的