使用 XtraScheduler 按特定自定义字段值获取约会

Posted

技术标签:

【中文标题】使用 XtraScheduler 按特定自定义字段值获取约会【英文标题】:Obtain Appointment by specific custom field value using XtraScheduler 【发布时间】:2012-06-17 23:22:34 【问题描述】:

我目前正在使用计划程序控件从我的应用程序中的 SQL 数据库保存和恢复计划的约会数据。调度程序控件本身被配置为使用几个自定义字段,如下所示:

private DevExpress.XtraScheduler.SchedulerControl _SchedulerControl;
private DevExpress.XtraScheduler.SchedulerControl StandingSchedulerControl

    get
    
        if (_SchedulerControl == null)
        
            _SchedulerControl = new DevExpress.XtraScheduler.SchedulerControl();

            BindingSource bs = new BindingSource();
            bs.DataSource = StandingOrderList;

            _SchedulerControl.Storage = new SchedulerStorage(this.components);
            _SchedulerControl.Storage.Appointments.AutoReload = true;
            _SchedulerControl.Storage.Appointments.Mappings.Subject = "Description";
            _SchedulerControl.Storage.Appointments.Mappings.RecurrenceInfo = "RecurrenceInfo";
            _SchedulerControl.Storage.Appointments.Mappings.Type = "Type";

            _SchedulerControl.Storage.Appointments.CustomFieldMappings.Add(new DevExpress.XtraScheduler.AppointmentCustomFieldMapping("Inactive", "Inactive"));
            _SchedulerControl.Storage.Appointments.CustomFieldMappings.Add(new DevExpress.XtraScheduler.AppointmentCustomFieldMapping("StandingOrderKEY", "StandingOrderKEY"));
            _SchedulerControl.Storage.Appointments.DataSource = bs;
            _SchedulerControl.EditRecurrentAppointmentFormShowing += new EditRecurrentAppointmentFormEventHandler(_SchedulerControl_EditRecurrentAppointmentFormShowing);
        
        return _SchedulerControl;
    

其中“StandingOrderList”定义为 StandingOrder 业务对象的列表。这样可以正确保存和恢复,但是在应用程序中可能只有一个“StandingOrderKEY”值,并且需要从该值获取存储中的 Appointment 对象。到目前为止,我的解决方案是这样的:

private Appointment GetAppointmentByStandingOrderKEY(Guid standingOrderKEY)

    Appointment findAppointment = StandingSchedulerControl.Storage.Appointments.Items.Find(appointment => (Guid)appointment.CustomFields["StandingOrderKEY"] == standingOrderKEY);
    return findAppointment;

但是,StandingSchedulerControl.Storage.Appointments.Items 似乎只包含具有 Normal 或 Pattern 类型的约会,这意味着如果 StandingOrderKEY 与保存的 ChangedOccurrence 或 DeletedOccurrence 相关联,则相关的找不到约会。

我已验证从列表创建的 BindingSource 实际上包含所有约会的例外。似乎当它被设置为 AppointmentStorage 的 DataSource 时,异常被安置在他们的 Pattern 约会中,并且只能通过首先获取对父约会的引用然后在该约会上调用 GetExceptions() 并搜索为 StandingOrderKEY 生成的集合。然而,这是一个问题,因为目前我们没有“父母”约会的识别信息,只有一个例外。

因此,我的问题如下(大致按优先顺序排列):

有没有办法通过自定义字段值从约会存储中获取约会对象,而忽略约会的类型?是否存在同时包含异常和正常/模式约会的集合? 我们预先知道约会将是一个例外,因为约会的类型已经存储。有没有办法搜索此特定自定义字段值的所有异常? 有没有办法通过数据源引用从约会存储中获取约会对象?用作 DataSource 的 BindingSource 包含异常约会。有没有办法给定 BindingSource 集合中的项目,将其与 Storage 中的项目相关联?

欢迎提出其他建议。感谢您的关注!

【问题讨论】:

【参考方案1】:

您能否尝试通过GetAppointments() 方法获取所有约会,看看是否有所不同:

Appointment findAppointment = StandingSchedulerControl.Storage
    .GetAppointments(startDate, endDate)
    .FirstOrDefault(a => (Guid)a.CustomFields["standingOrderKEY"] == 
                         standingOrderKEY);

我希望通过这种方式获得您的约会将包括您正在搜索的项目的其他事件。

我不知道仅通过异常进行搜索的方法。

您的第三个问题是,鉴于 BindingSource 中的项目,您可以从 AppointmentStorage 中获取 Appointment 吗?这与第一个问题本质上是相同的问题:鉴于您的 BindingSource 项中包含的数据,您仍然需要在 Scheduler 控件存储中搜索约会。

【讨论】:

感谢您的回复。目前,我的注意力已经转移到其他地方,所以可能需要一段时间才能验证这是一个解决方案,但我会看看以时尚方式获得约会是否包括例外情况。 不幸的是,这不是一个可接受的解决方案,因为需要“startDate”和“endDate”来收集约会,因为特定常规订单键的模式约会可以发生在任何时间范围。不过,+1,因为 GetAppointments 确实收集了异常。【参考方案2】:

我找到的最终解决方案是维护我自己的常规订单对象到约会的映射,如以下 DevExpress 解决方案所示:http://www.devexpress.com/Support/Center/p/E3143.aspx

这使我可以从源对象中获取约会对象,如上面的问题 3。

【讨论】:

以上是关于使用 XtraScheduler 按特定自定义字段值获取约会的主要内容,如果未能解决你的问题,请参考以下文章

在 Drupal 中按字段搜索自定义节点?

Symfony按特定字段的内容顺序排列

通过特定的自定义字段订购 WP 查询,不起作用

WooCommerce:为特定页面添加使用 WordPress 自定义字段添加到购物车旁边的自定义按钮

禁用在Woocommerce中编辑特定的管理员自定义字段

如果自定义字段是特定值,如何隐藏它? [关闭]