翻譯|使用教程|編輯:鮑佳佳|2020-07-03 17:43:18.270|閱讀 512 次
概述:本文介紹如何對日歷控件使用自定義數(shù)據(jù)源。它是基于標準的Visual Basic CalendarSample應用程序中包含的MySQL數(shù)據(jù)庫提供程序示例進行描述的。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
日歷控件具有對以下數(shù)據(jù)提供程序的內(nèi)置支持:內(nèi)存,XML文件(或二進制文件),數(shù)據(jù)庫(訪問),MAPI(Outlook)。
但是,許多人已經(jīng)有自己的數(shù)據(jù)來源,可以在“日歷”窗口中顯示數(shù)據(jù)。這可能是不支持Codejock Calendar數(shù)據(jù)庫模型的舊數(shù)據(jù)庫,可能是特定的數(shù)據(jù)庫服務器(Microsoft SQL Server,MySQL,F(xiàn)oxPro等),甚至可能是指定數(shù)據(jù)對象的自定義內(nèi)存數(shù)組,而該數(shù)組已經(jīng)具有自己的加載/保存代碼。
另一個問題是如何允許多人在不同的工作站上同時處理同一組約會(請注意,使用所描述的解決方案可能只會部分解決此問題)。
第三個問題是當人們擁有大量約定數(shù)據(jù)并且懷疑所有數(shù)據(jù)同時保存在內(nèi)存中時可能會出現(xiàn)問題。
通過實施自定義日歷數(shù)據(jù)提供程序,可以解決所有這些問題。
簡單的解決方案-自定義加載/保存事件代碼
首先讓我們考慮一個最簡單的情況-您有一個舊數(shù)據(jù)庫,只想在單個工作站上使用它,并且想用相應的工具欄按鈕打開并保存所有更改(或其他方式,主要思想是數(shù)據(jù)庫并不總是與日歷上顯示的數(shù)據(jù)庫同步)。
在這種情況下,正確的解決方案是根本不使用自定義數(shù)據(jù)提供程序:
您所需要做的就是使用標準的內(nèi)存數(shù)據(jù)提供程序,該程序默認情況下是通過Calendar控件創(chuàng)建的。當然,它可以序列化為XML文件,但是如果您不提供文件名,那么Memory DataProvider將會成為您的事件的簡單存儲。您必須用事件填充日歷,然后允許用戶使用它們,并在保存時通過迭代所有日歷事件來更新數(shù)據(jù)庫中的所有數(shù)據(jù)。這可能以以下方式顯示:
加載:'加載事件 Sub Populate() objCalendar.DataProvider.RemoveAllEvents '<打開事件記錄集或集合> '<迭代此集合> 對于 objEventsCollection 中的每個 objEvent 設置 objCalendarEvent = objCalendar.DataProvider.CreateEventEx(objEvent.ID) objCalendarEvent.StartTime = .. 。 ... objCalendar.DataProvider.AddEvent objCalendarEvent 下一頁 objCalendar.Populate 結束小組保存:
“迭代事件和保存到數(shù)據(jù)庫 私人 小組保存() 昏暗 objEvent 作為 CalendarEvent 對于 每個 objEvent 在 objCalendar.DataProvider.GetAllEventsRaw ” <節(jié)省事件屬性> “objEvent.Id ‘objEvent.Subject 接著 ’<提交節(jié)省> 結束 子復雜的解決方案-定制數(shù)據(jù)提供者
CalendarControl.SetDataProvider“ Provider =自定義;”當您擁有自己要顯示的數(shù)據(jù)源(例如DB或內(nèi)存集合),約定記錄眾多或想要具有多用戶工作環(huán)境時,需要自定義數(shù)據(jù)提供程序。
已經(jīng)有幾個標準示例可用(用于MS SQL Server和MySQL)。
簡要介紹其工作原理:它要求您在數(shù)據(jù)源中創(chuàng)建/讀取/更新日歷事件。設置“自定義數(shù)據(jù)提供程序-日歷”時,您可以發(fā)送一些通知,以捕獲和處理數(shù)據(jù)操作:例如從數(shù)據(jù)庫讀取事件數(shù)據(jù)并填充日歷事件對象成員或更新/創(chuàng)建/刪除數(shù)據(jù)庫記錄。Private Sub Calendar_DoCreateEvent(ByVal pEvent As _ XtremeCalendarControl.CalendarEvent,NewEventID _ As Long,bResult As Boolean) '1)從pEvent獲取屬性'2)準備并執(zhí)行相應的SQL語句,該語句將'新事件添加到數(shù)據(jù)庫中'3)如果數(shù)據(jù)庫有自動遞增的事件ID字段,檢索“它一個新的事件,并分配到NewEventID ” 4)集bResult為true,如果一切操作順利完 結束小組關于遞歸
加載重復模式時,還必須加載和設置與此模式相關的所有日歷事件異常。
正在加載重復發(fā)生master事件
當您讀取具有“master”重復狀態(tài)的日歷事件對象并將其返回給自定義數(shù)據(jù)提供程序時,有一個技巧。
日歷事件對象有2個特殊的自定義屬性:“ process_RecurrenceState”和“ process_RecurrencePatternID”。它們用于處理master事件。如果設置了它們,并且RecurrenceState為“ master”,則自定義數(shù)據(jù)提供程序?qū)⒂|發(fā)DoReadRPattern事件,并將該事件作為Master。并且還將為RetrieveDayEvents方法生成事件。這些屬性是臨時的,它們將被數(shù)據(jù)提供者刪除。
如果未設置這些屬性–但是自定義數(shù)據(jù)提供者期望主事件已經(jīng)完成-調(diào)用CreateRecurrence方法并設置重復模式。
當事件和模式分別存儲在不同的表中時,此機制對于DB數(shù)據(jù)提供程序很有用。
但是,如果事件存儲在某個內(nèi)存集合或數(shù)組中,則不應使用它,因為主事件在內(nèi)部存儲了重復模式。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務必注明出處、不得修改原文相關鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn