DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储
DevExpress年终击穿底价,单套授权低至67折!查看详情>>>
在上篇随笔《DevExpress XtraScheduler日程管理控件应用实例(1)-- 基本使用》中介绍了DevExpress 的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如OutLook里面就有日历的模块,但是这个日程控件真的是很复杂的一个控件,需要全面掌握可能需要花费很多的时间去了解,由于是技术研究,我总是希望把它常用的功能剖析的更加彻底一 些,前面随笔也介绍了它的存储功能,把它基于实体类的方式存储在数据库里面,不过介绍的还不够,本文继续上面的内容,进行数据存储方面的介绍。
1、数据绑定及加载的处理回顾
在上篇随笔里面,我总体性介绍了这个控件的数据绑定,以及数据是如何保存到数据库里面的,绑定到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;
2、日程数据的增删改处理
但是,上面这样的存储在是实际上是比较少的,也就是我们往往可能会在界面上进行新增或者复制记录,修改记录,或者删除记录等操作,因此需要进一步利用日程控件的完善接口来处理这些操作。 我们在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();//必须,每次修改需要刷新数据源,否则界面需要重新刷新
3、多人资源的处理
在日程控件里面,支持多人资源的处理,默认是资源只能选择其一,需要多人的话,那么就需要设置下面的属性来显示声明使用多人资源,如下所示。
- 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();
- }
以上就是我们经常用到的日程控件的处理内容了,希望对大家有所帮助。
===============================================================

DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储的更多相关文章
- DevExpress XtraScheduler日程管理控件应用实例(1)-- 基本使用
在一些应用场景中,我们可能需要记录某一天,某个时段的日程安排,那么这个时候就需要引入了 DevExpress 的日程控件XtraScheduler 了,这个控件功能非常强大,提供了很好的界面展现方式, ...
- 日程管理控件 glDatePicker
之前接触过一款日程管理控件,叫 FullCalendar,功能很强大,会列出每天的事项,可选择编辑并且可以定制自己的日历,然而,有时候,我们的网页上只需要一个简单的日历,迷你但实用,有日程安排的日期高 ...
- FullCalendar(日程管理控件)
(以下是我学习FullCalendar控件时,网络上收集的一些资料) jQuery.fullCalendar官方网址: http://arshaw.com/fullcalendar/ http://a ...
- [iOS基础控件 - 6.11.5] 沙盒 & 数据存储
A.沙盒 每个APP都有一个沙盒,是独立存在的 1.Xcode5和Xcode6的模拟器文件目录 a.模拟器路径改版 (1)Xcode5中模拟器路径为:/Users/用户名/Library/Appl ...
- 在DevExpress中使用CameraControl控件进行摄像头图像采集
在我们以前的项目了,做摄像头的图片采集,我们一般还是需要做一个封装处理的,在较新版本的DevExpress控件里面,增加了一个CameraControl控件,可以直接调用摄像头显示的,因此也可以做头像 ...
- 关于 DevExpress.XtraTreeList.TreeList 树形控件 的操作
作为一个C#程序员,在写程序时一直以来都使用的微软那一套控件,用起来特别爽,可是最近公司的一个项目用到了DevExpress框架,不用不知道,一用吓一跳,不得不承认这个框架确实很强大,效果也很炫,但是 ...
- dhtmlxScheduler日程安排控件
dhtmlxScheduler是一个JavaScript日程安排控件 官方网站:http://www.dhtmlx.com/在线帮助文档:http://docs.dhtmlx.com/doku.php ...
- 在DevExpress中使用WizardControl控件构建多步向导界面
利用好的界面控件,往往能做成比较界面体验效果.在一些界面操作里面,我们可能把它拆分为几部进行处理,这个时候引入WizardControl向导控件应该是比较不错的选择了.多步的处理方式,可以让用户避免一 ...
- DevExpress winform XtraEditor常用控件
最近在公司里面开始使用DevExpress winform的第三方控件进行开发和维护,这里整理一些常用控件的资料以便于后续查看 ComboBoxEdit 这个控件和winform自带的控件差不多,使用 ...
随机推荐
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 解决方法
项目忽然出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Pat ...
- 关于Java 中Integer 和Long对象 对比的陷阱(简单却容易犯的错误)
彩票客户端“忘记密码”功能有bug,今天调试时,发现了原因: 功能模块中有一段: if(userpo.getId()!=Long.valueOf(uid)){ throw new VerifyExce ...
- hdu 1796 How many integers can you find 容斥定理
How many integers can you find Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 ...
- testNG 学习笔记 Day 1 使用功能详解
TestSuite处理测试用例有6个规约(否则会被拒绝执行测试) A 测试用例必须是公有类(Public) B 测试用例必须继承与TestCase类 C 测试用例的测试方法必须是公有的( Public ...
- .net Parallel并行使用
因项目响应过慢,代码优化空间不大,在暂时无法调整系统架构的情况下,只有使用.NET中的TPL解决一些模块耗时过多的问题.但在使用过程中也碰到了一些问题,现在把它写下来,用于备忘. 1. Paralle ...
- VcCallC#_02
1.VC代码:(vs2013运行正常) // ConsoleApplication_CallCS.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h&quo ...
- 《剑指offer》第三十题(包含min函数的栈)
// 面试题30:包含min函数的栈 // 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min // 函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). #i ...
- resin中关于url rewrite来传递jsessionid的问题
最近两天在项目中碰到,一个很奇怪的问题.同一个账号多次切换登录时,会出现这个账号的信息在session中找不到,虽然可以登录成功,但是之后这个用户信息好像没有保存到session中一样,或者是被改变了 ...
- m_Orchestrate learning system---三十三、公共变量多弄成全局变量
m_Orchestrate learning system---三十三.公共变量多弄成全局变量 一.总结 一句话总结:比如班级id,小组id,这样省事,而且减少数据库的访问,加快访问速度,而且节约代码 ...
- mRNA基本概念
mRNA是由DNA的一条链转录而来的(可以是正链,也可以是反链),DNA是由非编码区和编码区组成,编码区也有其特殊的结构,主要有外显子和内含子组成. mRNA的一个重要性质就是可变剪切,也就是同一个编 ...