DevExpress中文网站 > 新手入门 > DevExpress Scheduler怎么做重复事件 DevExpress Scheduler时区显示不一致怎么处理
教程中心分类
DevExpress Scheduler怎么做重复事件 DevExpress Scheduler时区显示不一致怎么处理
发布时间:2026/04/20 13:56:07

  做Scheduler时,很多人前面以为“重复事件能出来就行”,后面才发现真正麻烦的是系列规则、例外记录和时区显示会一起牵动。DevExpress官方文档把这两件事分得很清楚:重复事件的规则存放在`Appointment.RecurrenceInfo`里,显示和存储时间又会受`TimeZoneId`、`EnableTimeZones`、`DateTimeSavingMode`和当前Scheduler时区影响,所以这类问题更适合按“先建规则、再校时间”的顺序处理。

  一、DevExpress Scheduler怎么做重复事件

 

  做重复事件时,不建议先在结果层反复改某一次出现的时间。更稳的做法,是先把“系列本体”建对,再决定哪些场景要做例外。因为DevExpress的重复事件本来就是由pattern appointment负责定义规则,再自动生成occurrences。

 

  1、先把事件建成Pattern

 

  在代码层,重复事件不是普通appointment直接循环出来的,而是要把事件作为pattern使用,再由`RecurrenceInfo`保存重复规则。DevExpress也明确区分了普通事件、Pattern、ChangedOccurrence和DeletedOccurrence这些类型。

 

  2、重复频率先看`RecurrenceInfo.Type`

 

  如果你要做每天、每周、每月或每年的重复,不要先写很多自定义判断,先看`IRecurrenceInfo.Type`。官方说明里列出了minutely、hourly、daily、weekly、monthly、yearly六类时间基准,再用周期值去定每隔多久重复一次。

 

  3、系列时长用开始、结束和结束条件一起控

 

  重复事件不是只有“按周重复”这一件事,系列从哪天开始、到哪天结束、按次数结束还是按日期结束,都要一起定。官方示例说明,`RecurrenceInfo`里的开始、结束和周期条件共同决定这条系列会生成哪些occurrences。

 

  4、改某一次时不要直接改原系列

 

  如果用户只想改本周三这一条,不要回头把整条系列重写。DevExpress的数据模型本来就支持exceptions,改动某一次会形成`ChangedOccurrence`,删除某一次会形成`DeletedOccurrence`,它们和原系列通过同一个recurrence关系挂起来。

 

  二、DevExpress Scheduler时区显示不一致怎么处理

 

  时区显示不一致时,最容易误判成“前端显示错了”。实际上,DevExpress这里至少有三层时间在同时起作用:Scheduler当前显示时区、单个事件的`TimeZoneId`,以及数据源保存时间所采用的`DateTimeSavingMode`。这三层只要有一层没对上,显示出来就会前后不一致。

 

  1、先把时区支持打开

 

  如果你需要按事件时区显示,先确认`SchedulerStorageBase.EnableTimeZones`已经启用,而且`Appointment.TimeZoneId`已经映射到数据字段。官方文档明确写到,不开时区支持时,事件不会按独立时区正确显示。

  2、先统一Scheduler自己工作的时区

 

  Scheduler本身也有工作时区。WPF文档说明,`SchedulerControl.TimeZone`决定控件显示所依据的时区,未设置时默认使用主机本地时区;WinForms存储层则有`TimeZoneId`概念。实际排查时,先确认控件和存储是不是站在同一时区上,再看单条事件。

 

  3、再核`DateTimeSavingMode`

 

  如果数据库里的开始时间和结束时间存储方式跟当前模式不一致,显示就会整体偏移。官方说明里给了三种模式:`Appointment`、`Storage`和`Utc`;同时明确提醒,不要在同一张数据表上来回切换模式,否则原数据会被按错误时区解释。

 

  4、重复事件的时区要到系列层看

 

  这是最容易漏的一点。官方文档明确指出,处理recurring appointments时,时区应该在recurrence dialog那一层设置,而不是只改普通appointment form;如果关闭了时区支持,重复系列会按storage time zone计算,最终很容易让用户觉得“每次展开都不一样”。

 

  三、DevExpress Scheduler先校哪几个时间字段

 

  这类问题真正难的,不是不会改属性,而是顺序容易反。明明是存储时间方式错了,却先去改某一条occurrence;明明是系列时区没设对,却一直在补单次例外。更稳的处理顺序,应该是先校存储层,再校系列层,最后才校单次事件。这样做的好处是,排查路径更短,也不容易一边修显示一边把重复规则带乱。

 

  1、第一步先查`DateTimeSavingMode`

 

  因为这是最底层的存储解释方式。只要这里错了,后面控件不管显示哪个时区,读出来的时间都会先偏一层。

 

  2、第二步再查Scheduler当前时区

 

  确认Scheduler自己当前依据哪个时区在显示,尤其是多端部署或服务器与客户端时区不同的时候,这一步必须先查清。

 

  3、第三步再查重复系列的`TimeZoneId`

 

  如果普通事件没问题,重复事件总偏,就重点回到系列本体,看recurrence相关时区是不是设在正确层级,而不是只改了某一次occurrence。

 

  4、第四步最后才处理exceptions

 

  只有当前三层都已经站稳,再去看`ChangedOccurrence`或`DeletedOccurrence`才有意义。否则你改掉的很可能只是表现,不是根因。

  总结

 

  DevExpress Scheduler怎么做重复事件,关键不是先改某一次显示,而是先把pattern和`RecurrenceInfo`这层规则建稳。DevExpress Scheduler时区显示不一致怎么处理,重点也不是只盯页面时间,而是把`EnableTimeZones`、Scheduler当前时区、`TimeZoneId`和`DateTimeSavingMode`放到一条线上一起核。顺着“先存储、再系列、后单次”的顺序排,重复事件和时区问题通常会比来回补例外更容易收住。

读者也访问过这里:
135 2431 0251