在DevExpress SchedulerControl中,周期日程并不是把同一条预约复制多份,而是保存一条Pattern类型的主日程,再根据RecurrenceInfo中的周期规则动态生成Occurrence。创建时如果只设置开始时间和周期类型,却遗漏Pattern类型、周期范围或数据字段映射,就容易出现日程只显示一次、周期次数不正确或重新加载后规则消失。围绕“DevExpress SchedulerControl怎么创建周期日程DevExpress SchedulerControl周期规则不生效如何调整”,需要同时检查日程类型、RecurrenceInfo和数据绑定。
一、DevExpress SchedulerControl怎么创建周期日程
SchedulerControl中的周期规则保存在Appointment.RecurrenceInfo中,可以设置按天、周、月、年、小时或分钟重复,并通过Range控制周期结束方式。
1、创建周期日程对象
①通过schedulerControl.DataStorage.CreateAppointment创建Appointment,并设置开始时间、结束时间和Subject。
②将Appointment.Type设置为AppointmentType.Pattern。Pattern负责保存整个周期系列的规则,本身不会作为普通日程重复显示。
③获取appointment.RecurrenceInfo,设置Type、Start、Periodicity和周期范围。
④配置完成后,将Appointment加入schedulerControl.DataStorage.Appointments。
例如创建一个每周一重复、共执行10次的日程,可以按下面的方式设置:
RecurrenceInfo.Type决定按什么时间单位重复,Periodicity则控制间隔,例如Weekly配合Periodicity为2表示每两周重复一次。
2、正确设置周期结束条件
①需要永久重复时,将Range设置为RecurrenceRange.NoEndDate。
②需要按照次数结束时,设置为RecurrenceRange.OccurrenceCount,同时填写OccurrenceCount。
③需要在指定日期结束时,设置为RecurrenceRange.EndByDate,并填写End。
④修改范围后重新检查其他字段,因为不同Range只读取与自身对应的结束参数。
例如Range为OccurrenceCount时,End不会决定周期结束时间;Range为EndByDate时,OccurrenceCount也不会生效。
二、DevExpress SchedulerControl周期规则不生效如何调整
周期规则不生效时,先判断是“从来没有生成周期实例”,还是“第一次正常,保存并重新加载后失效”。前者通常属于规则设置问题,后者更应该检查数据库字段映射。
1、检查Appointment类型
①查看周期主日程的Type是否为AppointmentType.Pattern。
②如果仍然是AppointmentType.Normal,即使填写了RecurrenceInfo,也应重新按周期日程方式创建。
③不要手工把每个Occurrence添加到Appointments集合。Occurrence是根据Pattern动态生成的,并不会作为普通周期实例逐条保存在集合中。
④需要修改整组日程时修改Pattern;只修改某一天时,再建立ChangedOccurrence异常实例。
2、检查RecurrenceInfo的开始时间和范围
①确认RecurrenceInfo.Start位于实际需要生成周期日程的日期范围内。
②检查SchedulerControl当前视图显示的日期。如果周期从9月开始,而当前停留在8月,看不到日程并不代表规则失效。
③使用EndByDate时,确认End晚于Start;使用OccurrenceCount时,确认次数大于0。
④检查WeekDays、Month、DayNumber等参数是否与当前RecurrenceType匹配。
RecurrenceInfo.Start定义整个周期范围的起点,结束位置则由Range及其对应参数决定。
3、检查数据绑定字段
数据库绑定模式下,周期日程第一次创建正常,重新打开程序后变成普通日程,通常要重点检查Mappings。
①检查Appointment数据表是否有保存日程类型和周期规则的字段。
②在Appointments的Mappings中,将对应字段映射到Type和RecurrenceInfo。
③确认RecurrenceInfo字段能够保存完整规则字符串,数据库字段长度过短时可能出现内容截断。
④修改数据库数据后,如果没有自动重新加载,执行SchedulerDataStorage.RefreshData()刷新。
绑定模式会通过Mappings在数据源字段与Appointment属性之间同步数据,其中包括日程类型和周期信息。
4、检查修改和删除的单次日程
周期中的某一次日程被单独修改后,会成为ChangedOccurrence;被删除后则成为DeletedOccurrence。这些异常实例会覆盖原本由Pattern计算出来的Occurrence。
①获取当前Pattern对应的异常实例,检查目标日期是否已经存在ChangedOccurrence或DeletedOccurrence。
②某一次日程被误修改时,可以调用RestoreOccurrence()恢复为普通Occurrence。
③修改整个周期规则后,重新检查以前建立的单次修改是否仍符合当前业务要求。
④数据库存储异常实例时,还要保证Pattern与异常日程之间的关联字段完整,避免重新加载后无法找到对应周期系列。
三、如何稳定维护SchedulerControl周期日程
周期日程投入实际项目后,建议把Pattern和单次异常分开处理,不要直接生成大量普通Appointment模拟周期效果。
1、按固定顺序验证
①先在非绑定模式创建一个简单的每日周期,确认SchedulerControl能够正常生成多个Occurrence。
②再增加Weekly、Monthly等复杂规则,检查Periodicity和WeekDays。
③随后接入数据库,重点验证程序关闭并重新启动后周期规则是否仍然存在。
④最后测试修改单次、删除单次和修改整个系列,确认异常实例处理正确。
2、区分规则问题和数据显示问题
周期规则正确但界面没有显示时,还要检查资源筛选、时间范围和数据刷新。尤其使用Resource时,如果Appointment映射了错误的ResourceId,日程可能已经生成,只是没有显示在当前资源下。没有使用资源功能时,也应避免错误映射ResourceId字段。
总结
处理“DevExpress SchedulerControl怎么创建周期日程DevExpress SchedulerControl周期规则不生效如何调整”时,应先使用Pattern类型建立主日程,再通过RecurrenceInfo配置周期类型、开始时间、间隔和结束范围。规则不生效时,重点检查AppointmentType、Range对应参数、RecurrenceInfo数据映射以及ChangedOccurrence和DeletedOccurrence。把周期规则与单次异常分开维护,可以减少日程重复、规则丢失和重新加载后显示异常的问题。希望本文对大家使用DevExpress SchedulerControl管理周期日程有所帮助,如需进一步了解相关软件与开发应用,可联系咨询。
