如何在该约会的活动期间从日历中删除DevExpress约会?

时间:2013-12-04 20:29:54

标签: c# event-handling devexpress

我的SchedulerStorage中有一个DevExpress SchedulerControl,其中包含各种约会。在某些情况下,由于在另一个窗口或应用程序的另一个实例中进行的更改,约会可能会变得无效。当约会被拖延时放入日历窗口,我想检测一下这个&删除约会。

这是我现在拥有的代码的简化版本:

private void myScheduleControl_AppointmentDrop(object sender, AppointmentDragEventArgs e)
{
   if (!IsAppointmentValid(e.EditedAppointment))
   {
      // remove appointment here
      e.Handled = true;
      return;
   }

   // do other stuff
}

问题在于,当删除无效约会时,此代码会运行,但约会仍会显示在日历中。我在调用mySchedulerControl.DeleteAppoint(e.EditedAppointment)mySchedulerStorage.Appointments.Remove(e.EditedAppointment)之间尝试了mySchedulerControl.SuspendLayout()mySchedulerControl.ResumeLayout(),但没有成功。

我使用DevExpress的经验是,在处理该对象上的事件时,通常会更改或删除对象的方法无效。如何在不重新填充整个ScheduleStorage的情况下删除这一个约会?

在其他地方,我看到了一个建议,即在事件结束后使用BeginInvoke()来运行。我现在还没有搞过调用;如果那是一种有效的方法,我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

根据DevExpress支持,它或多或少都是这样做的:

if (!IsAppointmentValid(e.EditedAppointment))
{
   BeginInvoke(new Action<SchedulerControl, Appointment>(
      delegate(SchedulerControl schdCtrl, Appointment appt)
      {
         schdCtrl.Storage.Appointments.Remove(appt);
      }), mySchedulerControl, e.SourceAppointment);

   e.Handled = true;
   return;
}

使用e.SourceAppointment而不是e.EditedAppointment非常重要,因为e.EditedAppointment是包含更改的约会的克隆,而e.SourceAppointment是将要更改的实际约会。删除e.EditedAppointment无效,因为它不在约会集合中。

还需要在BeginInvoke()电话中执行此操作。在完成事件处理程序之后,执行一些额外的处理,以查找被拖动的约会。放在约会集合中。该集合将忽略在事件期间删​​除它的请求(即使您正确地要求它删除e.SourceAppointment),如果您直接更改约会数据源,您将在事件发生后的DevExpress代码中获得未处理的异常处理程序返回。