圖文詳解!DevExpress XtraScheduler日程管理控件應(yīng)用實例(2)-- 深入理解數(shù)據(jù)存儲
在上篇隨筆《DevExpress XtraScheduler日程管理控件應(yīng)用實例》 中介紹了 DevExpress 的XtraScheduler日程控件的各種使用知識點,對于我們來說,日程控件不陌生,如OutLook里面就有日歷的模塊,但是這個日程控件真的是很復(fù)雜的一個控件,需要全面掌握可能需要花費很多的時間去了解,由于是技術(shù)研究,我總是希望把它常用的功能剖析的更加徹底一 些,前面隨筆也介紹了它的存儲功能,把它基于實體類的方式存儲在數(shù)據(jù)庫里面,不過介紹的還不夠,本文繼續(xù)上面的內(nèi)容,進行數(shù)據(jù)存儲方面的介紹。
在查閱了大量資料,以及一兩天的潛入研究,總算把它的數(shù)據(jù)存儲和相關(guān)熟悉有一個比較清晰的了解。
1、數(shù)據(jù)綁定及加載的處理回顧
在上篇隨筆里面,我總體性介紹了這個控件的數(shù)據(jù)綁定,以及數(shù)據(jù)是如何保存到數(shù)據(jù)庫里面的,綁定到DevExpress的XtraScheduler日程控件的步驟是需要先設(shè)置好映射關(guān)系(Mappings),然后綁定數(shù)據(jù)源即可。
操作代碼如下所示。
/// <summary> /// 設(shè)置日程控件的字段映射 /// </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到對應(yīng)的數(shù)據(jù)源里面接口。
//從數(shù)據(jù)庫加載日程信息 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、日程數(shù)據(jù)的增刪改處理
但是,上面這樣的存儲在是實際上是比較少的,也就是我們往往可能會在界面上進行新增或者復(fù)制記錄,修改記錄,或者刪除記錄等操作,因此需要進一步利用日程控件的完善接口來處理這些操作。
我們在VS的對應(yīng)控件屬性里面可以看到一些關(guān)于存儲的重要事件,也就是日程的增刪改處理事件,如下所示。
上面這幾個事件也就是對應(yīng)在日程控件里面右鍵菜單對應(yīng)的增刪改操作。
另外日程控件還可以支持拖動修改、拖動復(fù)制、刪除鍵刪除操作的,這些也是會繼續(xù)調(diào)用上面那些增刪改的操作事件的,所以我們就對他們進行完善,我們重點是處理ing類型的事件,如Inserting的事件,在寫入日程控件集合之前的處理。
//寫回數(shù)據(jù)庫操作的事件 control.Storage.AppointmentInserting += Storage_AppointmentInserting; control.Storage.AppointmentChanging += Storage_AppointmentChanging; control.Storage.AppointmentDeleting += Storage_AppointmentDeleting;
對于修改數(shù)據(jù)前的處理,我們是讓它在順利寫入數(shù)據(jù)庫后,在決定是否更新日程對象的存儲集合還是丟棄修改記錄,如下所示。
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代表是否放棄,上面的代碼邏輯就是如果我們順利寫入數(shù)據(jù)庫,那么就可以成功更新到日程控件的存儲集合里面,而且就可以在界面看到最新的結(jié)果。
有了上面的理解,我們就可以進一步完善在插入前、刪除前的代碼處理了。
對于刪除前的操作,我們可以用的代碼如下所示。
void Storage_AppointmentDeleting(object sender, PersistentObjectCancelEventArgs e) { Appointment apt = e.Object as Appointment; if (apt != null && apt.Id != null) { if (MessageDxUtil.ShowYesNoAndWarning("您確認(rèn)要刪除該記錄嗎?") == DialogResult.Yes) { bool success = BLLFactory<UserAppointment>.Instance.Delete(apt.Id); e.Cancel = !success; } } }
我們使用代碼MessageDxUtil.ShowYesNoAndWarning來判斷是否繼續(xù),如下界面所示。
對于插入的記錄,我們需要更加注意,需要寫入數(shù)據(jù)庫后,進行本地的存儲記錄的更新,這樣才能合理顯示,否則容易發(fā)生復(fù)制、創(chuàng)建的記錄位置總是不對,偏移到其他地方去的。
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就是我們從數(shù)據(jù)庫加載日程信息,并綁定到日程控件的存儲對象里面,其中需要注意的就是需要使用RefreshData方法,讓日程控件的存儲對象刷新一下,這樣才能夠順利顯示我們添加的記錄。
//從數(shù)據(jù)庫加載日程信息 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();//必須,每次修改需要刷新數(shù)據(jù)源,否則界面需要重新刷新
3、多人資源的處理
在日程控件里面,支持多人資源的處理,默認(rèn)是資源只能選擇其一,需要多人的話,那么就需要設(shè)置下面的屬性來顯示聲明使用多人資源,如下所示。
schedulerControl1.Storage.Appointments.ResourceSharing = true;
使用多人的資源,可以對資源進行復(fù)選,它的映射記錄就是ResourceIds的了,所以設(shè)置映射屬性的時候,我們需要判斷這個ResourceSharing 屬性。
if(control.ResourceSharing) { appoint.ResourceId = "ResourceIds"; } else { appoint.ResourceId = "ResourceId"; }
其中ResourceId的內(nèi)容格式如下所示
<ResourceIds> <ResourceId Type="System.String" Value="1" /><ResourceId Type="System.String" Value="2" /> </ResourceIds>
和ResourceId不同這里的值就是一個XML內(nèi)容,這個和提醒等內(nèi)容的存儲格式一樣,都是基于XML的內(nèi)容。日程控件涉及到的幾種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(); } //日程重復(fù)信息 if (apt.RecurrenceInfo != null) { info.RecurrenceInfo = apt.RecurrenceInfo.ToXml(); } //提醒信息 if (apt.Reminder != null) { info.ReminderInfo = ReminderCollectionXmlPersistenceHelper.CreateSaveInstance(apt).ToXml(); }
以上就是我們經(jīng)常用到的日程控件的處理內(nèi)容了,希望對大家有所幫助。
by 伍華聰
更多DevExpress資源請關(guān)注DevExpress中文網(wǎng)