提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|使用教程|编辑:我只采一朵|2016-03-31 14:09:43.000|阅读 1780 次
概述:本教程带你深入理解 DevExpress 日程管理控件 XtraScheduler数据存储。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
在上篇随笔《DevExpress XtraScheduler日程管理控件应用实例》 中介绍了 DevExpress 的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如OutLook里面就有日历的模块,但是这个日程控件真的是很复杂的一个控件,需要全面掌握可能需要花费很多的时间去了解,由于是技术研究,我总是希望把它常用的功能剖析的更加彻底一 些,前面随笔也介绍了它的存储功能,把它基于实体类的方式存储在数据库里面,不过介绍的还不够,本文继续上面的内容,进行数据存储方面的介绍。
在查阅了大量资料,以及一两天的潜入研究,总算把它的数据存储和相关熟悉有一个比较清晰的了解。
在上篇随笔里面,我总体性介绍了这个控件的数据绑定,以及数据是如何保存到数据库里面的,绑定到DevExpress的XtraScheduler日程控件的步骤是需要先设置好映射关系(Mappings),然后绑定数据源即可。
操作代码如下所示。
/// <summary> /// 设置日程控件的字段映射 /// </summary> /// <param name="control">日程控件</param> private void SetMappings(SchedulerControl control) { AppointmentMappingInfo appoint = control.Storage.Appointments.Mappings; appoint.AllDay = "AllDay"; appoint.Description = "Description"; appoint.End = "EndDate"; appoint.Label = "AppLabel"; appoint.Location = "Location"; appoint.RecurrenceInfo = "RecurrenceInfo"; appoint.ReminderInfo = "ReminderInfo"; appoint.ResourceId = "ResourceId"; appoint.Start = "StartDate"; appoint.Status = "Status"; appoint.Subject = "Subject"; appoint.Type = "EventType"; ResourceMappingInfo res = control.Storage.Resources.Mappings; res.Caption = "ResourceName"; res.Color = "Color"; res.Id = "ResourceId"; res.Image = "Image"; }
然后接着就是绑定Appointment和Resource到对应的数据源里面接口。
//从数据库加载日程信息 List<AppResourceInfo> resouceList = BLLFactory<AppResource>.Instance.GetAll(); this.schedulerStorage1.Resources.DataSource = resouceList; List<UserAppointmentInfo> eventList = BLLFactory<UserAppointment>.Instance.GetAll(); this.schedulerStorage1.Appointments.DataSource = eventList;
但是,上面这样的存储在是实际上是比较少的,也就是我们往往可能会在界面上进行新增或者复制记录,修改记录,或者删除记录等操作,因此需要进一步利用日程控件的完善接口来处理这些操作。
我们在VS的对应控件属性里面可以看到一些关于存储的重要事件,也就是日程的增删改处理事件,如下所示。
上面这几个事件也就是对应在日程控件里面右键菜单对应的增删改操作。
另外日程控件还可以支持拖动修改、拖动复制、删除键删除操作的,这些也是会继续调用上面那些增删改的操作事件的,所以我们就对他们进行完善,我们重点是处理ing类型的事件,如Inserting的事件,在写入日程控件集合之前的处理。
//写回数据库操作的事件 control.Storage.AppointmentInserting += Storage_AppointmentInserting; control.Storage.AppointmentChanging += Storage_AppointmentChanging; control.Storage.AppointmentDeleting += Storage_AppointmentDeleting;
对于修改数据前的处理,我们是让它在顺利写入数据库后,在决定是否更新日程对象的存储集合还是丢弃修改记录,如下所示。
void Storage_AppointmentChanging(object sender, PersistentObjectCancelEventArgs e) { Appointment apt = e.Object as Appointment; UserAppointmentInfo info = ConvertToAppoint(apt); bool success = BLLFactory<UserAppointment>.Instance.Update(info, apt.Id); e.Cancel = !success; }
注意上面的e.Cancel =true或者false代表是否放弃,上面的代码逻辑就是如果我们顺利写入数据库,那么就可以成功更新到日程控件的存储集合里面,而且就可以在界面看到最新的结果。
有了上面的理解,我们就可以进一步完善在插入前、删除前的代码处理了。
对于删除前的操作,我们可以用的代码如下所示。
void Storage_AppointmentDeleting(object sender, PersistentObjectCancelEventArgs e) { Appointment apt = e.Object as Appointment; if (apt != null && apt.Id != null) { if (MessageDxUtil.ShowYesNoAndWarning("您确认要删除该记录吗?") == DialogResult.Yes) { bool success = BLLFactory<UserAppointment>.Instance.Delete(apt.Id); e.Cancel = !success; } } }
我们使用代码MessageDxUtil.ShowYesNoAndWarning来判断是否继续,如下界面所示。
对于插入的记录,我们需要更加注意,需要写入数据库后,进行本地的存储记录的更新,这样才能合理显示,否则容易发生复制、创建的记录位置总是不对,偏移到其他地方去的。
void Storage_AppointmentInserting(object sender, PersistentObjectCancelEventArgs e) { Appointment apt = e.Object as Appointment; UserAppointmentInfo info = ConvertToAppoint(apt); bool success = BLLFactory<UserAppointment>.Instance.Insert(info); e.Cancel = !success; if (success) { LoadData(); } }
LoadData就是我们从数据库加载日程信息,并绑定到日程控件的存储对象里面,其中需要注意的就是需要使用RefreshData方法,让日程控件的存储对象刷新一下,这样才能够顺利显示我们添加的记录。
//从数据库加载日程信息 List<AppResourceInfo> resouceList = BLLFactory<AppResource>.Instance.GetAll(); this.schedulerStorage1.Resources.DataSource = resouceList; List<UserAppointmentInfo> eventList = BLLFactory<UserAppointment>.Instance.GetAll(); this.schedulerStorage1.Appointments.DataSource = eventList;
this.schedulerControl1.RefreshData();//必须,每次修改需要刷新数据源,否则界面需要重新刷新
在日程控件里面,支持多人资源的处理,默认是资源只能选择其一,需要多人的话,那么就需要设置下面的属性来显示声明使用多人资源,如下所示。
schedulerControl1.Storage.Appointments.ResourceSharing = true;
使用多人的资源,可以对资源进行复选,它的映射记录就是ResourceIds的了,所以设置映射属性的时候,我们需要判断这个ResourceSharing 属性。
if(control.ResourceSharing) { appoint.ResourceId = "ResourceIds"; } else { appoint.ResourceId = "ResourceId"; }
其中ResourceId的内容格式如下所示
<ResourceIds> <ResourceId Type="System.String" Value="1" /><ResourceId Type="System.String" Value="2" /> </ResourceIds>
和ResourceId不同这里的值就是一个XML内容,这个和提醒等内容的存储格式一样,都是基于XML的内容。日程控件涉及到的几种XML的信息获取如下所示。
//多人资源的信息 if(apt.ResourceIds != null) { AppointmentResourceIdCollectionContextElement item = new AppointmentResourceIdCollectionContextElement(apt.ResourceIds); info.ResourceIds = item.ValueToString(); //第二种 //AppointmentResourceIdCollectionXmlPersistenceHelper helper = new AppointmentResourceIdCollectionXmlPersistenceHelper(apt.ResourceIds); //info.ResourceIds = helper.ToXml(); } //日程重复信息 if (apt.RecurrenceInfo != null) { info.RecurrenceInfo = apt.RecurrenceInfo.ToXml(); } //提醒信息 if (apt.Reminder != null) { info.ReminderInfo = ReminderCollectionXmlPersistenceHelper.CreateSaveInstance(apt).ToXml(); }
以上就是我们经常用到的日程控件的处理内容了,希望对大家有所帮助。
by
更多DevExpress资源请关注
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢