• <menu id="w2i4a"></menu>
  • logo DevExpress使用教程

    文檔首頁>>DevExpress使用教程>>圖文詳解!DevExpress XtraScheduler日程管理控件應(yīng)用實例(2)-- 深入理解數(shù)據(jù)存儲

    圖文詳解!DevExpress XtraScheduler日程管理控件應(yīng)用實例(2)-- 深入理解數(shù)據(jù)存儲


    在上篇隨筆《DevExpress XtraScheduler日程管理控件應(yīng)用實例》 中介紹了 DevExpress 的XtraScheduler日程控件的各種使用知識點,對于我們來說,日程控件不陌生,如OutLook里面就有日歷的模塊,但是這個日程控件真的是很復(fù)雜的一個控件,需要全面掌握可能需要花費很多的時間去了解,由于是技術(shù)研究,我總是希望把它常用的功能剖析的更加徹底一 些,前面隨筆也介紹了它的存儲功能,把它基于實體類的方式存儲在數(shù)據(jù)庫里面,不過介紹的還不夠,本文繼續(xù)上面的內(nèi)容,進行數(shù)據(jù)存儲方面的介紹。

    | 立即下載DevExpress安裝包,免費體驗30天!

    在查閱了大量資料,以及一兩天的潛入研究,總算把它的數(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)于存儲的重要事件,也就是日程的增刪改處理事件,如下所示。

    DevExpress XtraScheduler

    上面這幾個事件也就是對應(yīng)在日程控件里面右鍵菜單對應(yīng)的增刪改操作。

    DevExpress

    DevExpress

    另外日程控件還可以支持拖動修改、拖動復(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ù),如下界面所示。

    DevExpress

    對于插入的記錄,我們需要更加注意,需要寫入數(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;

    DevExpress

    使用多人的資源,可以對資源進行復(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)

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();