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 值有关:
还有个问题,没有填的时候,那些空起的地方,Text 如何对待之?
所以我们可以设置 TextMaskFormat 为 IncludePromptAndLiterals,如果 Text 为“____年__月__日”,则表示没有填。