我的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()
来运行。我现在还没有搞过调用;如果那是一种有效的方法,我该怎么做呢?
答案 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代码中获得未处理的异常处理程序返回。