订单日期、预约时间和报表查询区间,都可能用到日期控件。页面看起来只是一个输入框,配置时却容易碰到几种不同的问题,比如日期一点击就换了样式,日历里的日期不能选,手工输入却暂时没有提示。DevExpress在不同开发平台提供的日期组件并不相同,属性名称也不能混用。这里以WinForms中的DateEdit为例,说明显示格式、输入格式和可选日期范围的设置方法。
一、DevExpress日期控件怎么设置显示格式
日期控件的显示文字与实际日期值要分开看。格式设置负责页面上怎样呈现,输入掩码负责编辑时怎样填写,两处配置不一致,就可能出现点击前后样式变化。
1、设置未编辑时的日期样式
只要求页面按年月日显示时,可以设置显示格式。开发环境中的属性名称保留英文,查找和编写代码时应使用对应名称。
①在窗体设计器中选中【dateEdit1】,打开【属性】窗口,展开【Properties】。
②将【UseMaskAsDisplayFormat】设为false,再展开【DisplayFormat】,把【FormatType】设为DateTime。
③在【FormatString】中填写yyyy-MM-dd,运行窗体,给控件赋一个有效日期。
④将焦点移到其他控件,检查日期是否按“2026-11-05”这样的形式显示。
2、统一点击前后的格式
①选中【dateEdit1】,在【Properties】下将【EditMask】设为yyyy-MM-dd。
②将【UseMaskAsDisplayFormat】设为true,保存窗体配置。
③运行程序,在【dateEdit1】中输入日期,分别检查获得焦点和离开焦点后的文字。
启用掩码作为显示格式后,未编辑状态也会采用输入掩码。此时继续修改DisplayFormat,未必会改变页面上的日期样式。若业务希望编辑时与展示时采用不同格式,就应关闭这个选项,再分别安排显示和输入设置。
3、核对格式字符和实际值
①需要显示时间时,将【EditMask】改为yyyy-MM-dd HH:mm:ss,并按页面要求设置【UseMaskAsDisplayFormat】。
②检查【EditMask】中的月份是否使用MM、分钟是否使用mm,核对小时部分采用的格式。
③在调试器中查看【EditValue】,确认控件接收的是DateTime日期值,核对其中的年月日和时间。
④对于字符串来源的数据,使用【DateTime.ParseExact】按已知格式转换,再赋给【EditValue】。
二、DevExpress日期控件如何限制可选范围
预约只能选择开放日期,查询不能超过业务期间,这些都属于日期规则。限制连续区间与排除区间中的个别日期,使用的配置不同。
1、限定连续的日期区间
以只允许选择某个月为例,需要同时设置起止边界。上下限应来自同一套业务规则,避免一处按自然月计算,另一处仍使用旧的项目日期。
①在【dateEdit1】的【Properties】中找到【MinDate】和【MaxDate】,分别填写允许的起始日期与截止日期。
②使用代码配置时,在【InitializeComponent】执行之后,为【dateEdit1.Properties.MinDate】和【dateEdit1.Properties.MaxDate】赋DateTime值。
③将【EditValue】设为区间内的日期,运行程序,展开日历检查前后月份。
④分别尝试选择起始日、截止日和区间外日期,核对边界是否符合业务要求。
⑤如果安装版本提供的是【MinValue】和【MaxValue】,按该版本属性配置,避免混用不同版本的示例。
2、排除周末或指定日期
①在【dateEdit1】的事件列表中找到【DisableCalendarDate】,创建事件处理方法。
②在处理方法中读取当前日期,按周末、节假日或业务停用日期进行判断。
③对需要禁用的日期,将事件参数【e.IsDisabled】设为true。
④运行程序,展开【dateEdit1】的日历,检查被禁用的日期以及相邻可选日期。
日期范围适合表达连续区间,禁用日期事件适合处理区间中的例外。比如预约期覆盖整个月,但周末不开放,可以同时使用这两类设置。停用日期较多时,宜提前读取到集合中,避免日历绘制期间反复查询数据。
三、DevExpress日期控件设置后如何检查输入与保存
日历中的限制正常,还不能直接判定整个日期字段已经配置完成。键盘输入、数据加载和保存操作,都应使用相同的日期规则。
1、检查手工输入后的校验
①运行窗体,在【dateEdit1】中手工输入一个超出范围的日期,再将焦点移到其他输入框。
②检查【InvalidValue】事件中的处理代码,核对错误提示是否明确,是否保留了修改日期的机会。
③如果保存按钮会直接读取日期,在提交处理方法中调用【dateEdit1.DoValidate()】,根据校验结果决定是否继续保存。
④在保存逻辑中读取【EditValue】,再次核对允许区间、停用日期及必填要求。
DateEdit允许用户在输入过程中暂时键入超出上下限的值,校验会在失去焦点或主动调用校验方法时发生。看到数字能够输入,不能马上认定范围设置失效。也不宜一出现错误就把日期改成当天,否则用户可能没有发现数据已被替换。
2、核对空值与重新加载后的状态
日期字段是否必填,要与业务约定一致。允许暂存的单据和必须填写预约时间的表单,对空值的处理往往不同,界面配置也应跟着调整。
①在【Properties】中检查【AllowNullInput】,按业务要求决定是否允许用户清空日期。
②对必填字段,在保存逻辑中检查【EditValue】是否为空,并显示对应提示。
③重新打开一条已有记录,核对【EditValue】是否仍在当前允许范围内。
④检查窗体加载和数据绑定代码,搜索对【EditMask】、【MinDate】、【MaxDate】的再次赋值。
⑤保存测试记录后重新读取,对比【EditValue】与数据库中的日期,确认年月日及时间没有发生意外变化。
总结
日期控件配置得清楚,用户填写时就少一些猜测,后续查询和统计也更容易保持一致。显示到哪一位、允许选择哪些日期、空值能否保存,这些约定应与数据字段一起确定。页面只显示年月日,并不代表实际值中的时间已经被清除;日历限制也应与保存校验保持一致。希望这些设置方法能帮助大家把日期输入做得更清楚,减少表单交付后反复修改规则的情况。
