VARCHART XGantt是一個交互式的甘特圖控件,其模塊化的設計讓您能夠建立知足您和您的客戶所需求的應用程序。相較於其餘甘特圖控件,VARCHART XGantt穩定性高,開發時間長,各大行業的知名公司都在使用它。本文主要描述瞭如何使用日曆的內容,如今跟着小編來了解一下吧~
編程
日曆表示工做時間和非工做時間的無間隔序列。在具備可變配置文件的日曆(輪班日曆)中,不一樣的時間段會重複成功,例如早、晚或夜班。日曆自己沒有視覺外觀,僅是工做時間和非工做時間的邏輯區別。只有將日曆分配給CalendarGrid對象,日曆才能變得可見。app
在VARCHART XGantt中,日曆還能夠從工期中得出節點的開始和結束日期。若是未設置其餘選項,則將使用名爲BaseCalendar的預約義基本日曆進行全部計算。在基本日曆中,將星期一至星期五定義爲工做時間,而星期日和星期六則不工做。若是須要,能夠修改基本日曆。ide
定義日曆模塊化
日曆能夠在設計時經過屬性頁定義,也能夠在運行時經過應用程序編程接口(API)定義。在本文中,咱們將從開發人員的角度解釋日曆的基本處理,並提供一些C#編程示例。函數
在VcGantt控件中,存在一個對象VcCalendarCollection,它負責管理全部日曆。它具備與VARCHART XGantt中的其餘集合相似的管理功能。預約義的BaseCalendar和在設計時建立的任何其餘日曆會自動構成集合的一部分。oop
能夠經過CalendarCollection對象的Add方法建立一個新日曆。該方法須要惟一的名稱才能識別日曆。最初,新日曆僅由工做時間組成。spa
請注意:日曆必須至少包含一個時間間隔,由於不能存在包含非工做時間的日曆。設計
爲了使咱們的編程示例的結果可在甘特圖的圖片中獲得驗證,爲編程示例中的時間範圍定義了從2011年1月1日到2011年12月31日的恆定時間段。若是日曆在集合中被激活,則日曆只能在甘特圖的背景中可見:3d
示例代碼orm
'To Create and to activate a new calendar Dim calendar As VcCalendar VcGantt1.TimeScaleEnd = "01.01.2012" VcGantt1.TimeScaleStart = "01.01.2011" Set calendar = VcGantt1.CalendarCollection.Add("CompanyCalendar1") VcGantt1.CalendarCollection.Active = calendar
若是如今但願從新激活默認的基本日曆,則能夠經過如下設置來執行此操做:
示例代碼
'To re-activate the default calendar Dim calendar As VcCalendar Set calendar = VcGantt1.CalendarCollection.CalendarByName("BaseCalendar") VcGantt1.CalendarCollection.Active = calendar
在下面的示例中,咱們將顯示如何按時間間隔定義工做時間配置文件。定義非工做日的不規則模式:2011年1月1日以及2011年1月6日至1月20日,除了10日和11日的兩天:
示例代碼
'Defining non-working times VcGantt1.TimeScaleEnd = "01.01.2012" VcGantt1.TimeScaleStart = "01.01.2011" Dim calendar As VcCalendar Set calendar = VcGantt1.CalendarCollection.Add("CompanyCalendar1") VcGantt1.CalendarCollection.Active = calendar Dim interval As VcInterval Set interval = calendar.IntervalCollection.Add("NewYear") interval.CalendarProfileName = "" interval.StartDateTime = "01.01.2011" interval.EndDateTime = "02.01.2011" Set interval = calendar.IntervalCollection.Add("NonworkPeriod") interval.CalendarProfileName = "" interval.StartDateTime = "06.01.2011" interval.EndDateTime = "21.01.2011" Set interval = calendar.IntervalCollection.Add("WorkPeriod") interval.CalendarProfileName = "" interval.StartDateTime = "11.01.2011" interval.EndDateTime = "13.01.2011" VcGantt1.CalendarCollection.Update
在視覺上,能夠經過淺灰色陰影來識別非工做時間。因爲默認狀況下工做時間沒有顏色,所以圖表的白色背景在其中仍然可見。在下一步中,咱們但願工做時間以淺黃顏色顯示,非工做時間以淺藍色顯示。顏色由可在間隔處定義的圖形屬性產生。
示例代碼
'Assigning colors to intervals VcGantt1.TimeScaleEnd = "01.01.2012" VcGantt1.TimeScaleStart = "01.01.2011" Dim calendar As VcCalendar Set calendar = VcGantt1.CalendarCollection.Add("CompanyCalendar1") VcGantt1.CalendarCollection.Active = calendar VcGantt1.TimeScaleCollection.FirstTimeScale.Section(0).CalendarGridEx(0) .UseGraphicalAttributesOfIntervals = True Dim interval As VcInterval Set interval = calendar.IntervalCollection.Add("Work") interval.CalendarProfileName = "" interval.BackColorAsARGB = &HFFFFFFE0 interval.UseGraphicalAttributes = True Set interval = calendar.IntervalCollection.Add("NewYear") interval.CalendarProfileName = "" interval.StartDateTime = "01.01.2011" interval.EndDateTime = "02.01.2011" interval.BackColorAsARGB = &HFFD4E3F5 interval.UseGraphicalAttributes = True Set interval = calendar.IntervalCollection.Add("NonworkPeriod") interval.CalendarProfileName = "" interval.StartDateTime = "06.01.2011" interval.EndDateTime = "21.01.2011" interval.BackColorAsARGB = &HFFD4E3F5 interval.UseGraphicalAttributes = True Set interval = calendar.IntervalCollection.Add("WorkPeriod") interval.CalendarProfileName = "" interval.StartDateTime = "11.01.2011" interval.EndDateTime = "13.01.2011" interval.BackColorAsARGB = &HFFFFFFE0 interval.UseGraphicalAttributes = True VcGantt1.CalendarCollection.Update
下面的示例顯示如何定義一個星期,其中星期一至星期五爲工做時間,而週末爲空閒時間。到目前爲止引入的選項還不足以知足此要求;必須提供VcCalendarProfile類型的對象。
請注意:在VARCHART XGantt中,能夠在全局或局部級別上定義VcCalendarProfile對象。本地日曆配置文件對象只能在定義它們的日曆中使用,而全局對象能夠同時在不一樣的日曆中使用。在咱們的編程示例中,僅使用本地日曆配置文件對象。就功能而言,本地日曆與全局日曆沒有區別。若是建立了具備相同名稱的本地配置文件和全局配置文件,則在相應的日曆內僅尋址本地配置文件;沒法訪問全局配置文件。
vcWeekProfile類型的日曆配置文件容許描述一週中某天的工做時間和非工做時間。僅在將周配置文件添加到日曆的間隔集合後,該配置文件才生效。能夠省略設置StartDateTime和EndDateTime,由於咱們但願咱們的設置在日曆的整個期間內都是有效的,沒有任何限制。預設名稱<WORK>和<NONWORK>的日曆配置文件具備定義的含義:它們用於分配工做時間和非工做時間。
示例代碼
'Defining a week profile Dim calendar As VcCalendar Dim interval As VcInterval Dim calendarProfile As VcCalendarProfile Set calendar = VcGantt1.CalendarCollection.Add("CompanyCalendar1") VcGantt1.CalendarCollection.Active = calendar Set calendarProfile = calendar.CalendarProfileCollection.Add("WeekProfile") calendarProfile.Type = vcWeekProfile VcGantt1.TimeScaleCollection.FirstTimeScale.Section(0).CalendarGridEx(0) .UseGraphicalAttributesOfIntervals = True Set interval = calendarProfile.IntervalCollection.Add("Mo-Fr") interval.CalendarProfileName = "" interval.StartWeekday = vcMonday interval.EndWeekday = vcFriday Set interval = calendarProfile.IntervalCollection.Add("Sa") interval.CalendarProfileName = "" interval.BackColorAsARGB = &HFFFFF69F interval.StartWeekday = vcSaturday interval.EndWeekday = vcSaturday Set interval = calendarProfile.IntervalCollection.Add("Su") interval.CalendarProfileName = "" interval.BackColorAsARGB = &HFFFBD3AA interval.StartWeekday = vcSunday interval.EndWeekday = vcSunday Set interval = calendar.IntervalCollection.Add("StandardWeek") interval.CalendarProfileName = "WeekProfile"
區分一天中的工做時間和非工做時間須要一個日配置文件,該日配置文件能夠指定精確的時鐘時間,例如從8.00 h到12.00 h am和從1.00 h到5.00 h pm。因爲新建立的日簡介僅包含工做時間,所以任何中斷都應定義爲非工做間隔。
示例代碼
'Defining a day profile Dim interval As VcInterval Dim calendarProfile As VcCalendarProfile Set calendarProfile = calendar.CalendarProfileCollection.Add("DayProfile") calendarProfile.Type = vcDayProfile Set interval = calendarProfile.IntervalCollection.Add("Interval_1") ' 00:00-8:00 interval.CalendarProfileName = "" interval.StartTime = "1.1.2011 0:00" interval.EndTime = "1.1.2011 8:00" Set interval = calendarProfile.IntervalCollection.Add("Interval_2") ' 12:00-13:00 interval.CalendarProfileName = "" interval.StartTime = "1.1.2011 12:00" interval.EndTime = "1.1.2011 13:00" Set interval = calendarProfile.IntervalCollection.Add("Interval_3") ' 17:00-24:00 interval.CalendarProfileName = "" interval.StartTime = "1.1.2011 17:00" interval.EndTime = "1.1.2011 00:00"
時鐘時間由對象DateTime設置。日期部分被忽略,由於在這種狀況下它毫無心義。只須要在構造函數中設置日期,便可爲構造函數所需的全部參數設置一個值。在Interval_3中,指定0h或24h是很重要的,由於後者在DateTime對象中不被接受。
一年中的按期日期(例如1月1日的除夕夜或12月25日至26日的聖誕節和節禮日),由涵蓋整年的日曆配置文件定義。
示例代碼
'Setting a profile of fixed annual holidays Dim calendarProfile As VcCalendarProfile Dim interval As VcInterval Set calendarProfile = calendar.CalendarProfileCollection.Add("YearProfile") calendarProfile.Type = vcYearProfile Set interval = calendarProfile.IntervalCollection.Add("New Year") interval.CalendarProfileName = "" interval.DayInStartMonth = 1 interval.StartMonth = vcJanuary interval.DayInEndMonth = 1 interval.EndMonth = vcJanuary Call SetAppearanceForHolidays(interval) Set interval = calendarProfile.IntervalCollection.Add("Christmas") interval.CalendarProfileName = "" interval.DayInStartMonth = 25 interval.StartMonth = vcDecember interval.DayInEndMonth = 26 interval.EndMonth = vcDecember Call SetAppearanceForHolidays(interval)
爲了不重複設置產生相同的外觀,咱們使用名爲SetAppearanceForHolidays的方法收集調用:
示例代碼
'Method to set the visual appearance of holidays Private Sub SetAppearanceForHolidays(ByVal interval As VcInterval) interval.BackColorAsARGB = &HFFFFA4A4 interval.Pattern = vcWeavePattern interval.PatternColorAsARGB = &HFF404040 interval.LineColor = &HFF808080 interval.LineThickness = 1 interval.LineType = vcSolid interval.UseGraphicalAttributes = True End Sub
請注意:顏色屬性僅在其CalendarProfileName設置爲或的間隔內有效。另外,間隔屬性UseGraphicalAttribute須要設置爲true。對於calenderGrid屬性UseGraphicalAttributesOfIntervals一樣如此。
每一年必須計算浮動假期(例如復活節)和其餘與之相關的假期,而且須要將其做爲固定日期分配給日曆。下面的方法對此很是有用:
示例代碼
'Method to find floating holidays Const AshWednesday = 0 Const GoodFriday = 1 Const EasterSunday = 2 Const EasterMonday = 3 Const FeastOfCorpusChristi = 4 Const AscensionOfChrist = 5 Const WhitSunday = 6 Const WhitMonday = 7 Const CentralEuropeanSummerTimeStart = 8 Const CentralEuropeanSummerTimeEnd = 9 Private Function calculateAnniversaryForYear(ByVal year As Integer, ByVal specialDay As Integer) As Date Dim g As Integer Dim c As Integer Dim h As Integer Dim i As Integer Dim j As Integer Dim month As Integer Dim day As Integer Dim dayOffset As Integer g = year Mod 19 c = year Mod 100 h = (c - c / 4 - (8 * c + 13) / 25 + 19 * g + 15) Mod 30 i = h - (h / 28) * (1 - (29 / (h + 1)) * ((21 - g) / 11)) j = (year + year / 4 + i + 2 - c + c / 4) Mod 7 month = 3 + (i - j + 40) / 44 day = i - j + 28 - 31 * (month / 4) dayOffset = 0 Select Case specialDay Case AshWednesday dayOffset = -40 Case GoodFriday dayOffset = -2 Case EasterSunday dayOffset = 0 Case EasterMonday dayOffset = 1 Case AscensionOfChrist dayOffset = 39 Case WhitSunday dayOffset = 49 Case WhitMonday dayOffset = 50 Case FeastOfCorpusChristi dayOffset = 60 Case CentralEuropeanSummerTimeStart month = 3 day = 31 - Weekday("31.3" + yearConvert + 1) Case CentralEuropeanSummerTimeEnd month = 10 day = 31 - Weekday("31.10" + yearConvert + 1) End Select Dim tmpDate As Date tmpDate = day & "." & month & "." & year calculateAnniversaryForYear = tmpDate + dayOffset End Function
在下一步中,將周配置文件和假日配置文件做爲間隔分配給日曆。而後以相同的方式計算浮動假期並將其分配給日曆:
示例代碼
'Assembling the week profile, the holiday profile and the floating holidays into an interval Set interval = calendar.IntervalCollection.Add("Weekly_Pattern") interval.CalendarProfileName = "WeekProfile" Set interval = calendar.IntervalCollection.Add("Yearly_Pattern") interval.CalendarProfileName = "YearProfile" Dim startYear As Integer Dim endYear As Integer startYear = year(VcGantt1.TimeScaleStart) endYear = year(VcGantt1.TimeScaleEnd) Dim i As Integer For i = startYear To endYear Step i + 1 Set interval = calendar.IntervalCollection.Add("GoodFriday_" & i) interval.CalendarProfileName = "" interval.StartDateTime = calculateAnniversaryForYear(i, GoodFriday) interval.EndDateTime = calculateAnniversaryForYear(i, EasterMonday) 'interval.StartDateTime Call SetAppearanceForHolidays(interval) Set interval = calendar.IntervalCollection.Add("EasterMonday_" & i) interval.CalendarProfileName = "" interval.StartDateTime = calculateAnniversaryForYear(i, EasterMonday) interval.EndDateTime = interval.StartDateTime Call SetAppearanceForHolidays(interval) Set interval = calendar.IntervalCollection.Add("FeastOfCorpusChristi_" & i) interval.CalendarProfileName = "" interval.StartDateTime = calculateAnniversaryForYear(i, FeastOfCorpusChristi) interval.EndDateTime = interval.StartDateTime Call SetAppearanceForHolidays(interval) Set interval = calendar.IntervalCollection.Add("AscensionOfChrist_" & i) interval.CalendarProfileName = "" interval.StartDateTime = calculateAnniversaryForYear(i, AscensionOfChrist) interval.EndDateTime = interval.StartDateTime Call SetAppearanceForHolidays(interval) Set interval = calendar.IntervalCollection.Add("WhitMonday_" & i) interval.CalendarProfileName = "" interval.StartDateTime = calculateAnniversaryForYear(i, WhitMonday) interval.EndDateTime = interval.StartDateTime Call SetAppearanceForHolidays(interval) Next VcGantt1.CalendarCollection.Update
這些是組裝日曆所需的摘要步驟。根據要求,能夠省略單個步驟:
建立不一樣工做日的日配置文件
經過使用日配置文件組裝周配置文件
定義假期資料
將星期概要和假日概要分配給日曆的間隔集合
爲間隔集合分配其餘日期(例如,浮動假期)
間隔對象容許定義可解釋爲工做時間或非工做時間的時間段。經過CalendarProfileName屬性將句點區分爲或。經過此屬性,日曆還能夠引用其餘現有配置文件並採用其設置。設置此屬性時,請注意,根據間隔類型,只能分配某些配置文件類型。間隔類型由選定的配置文件類型隱式選擇。日曆配置文件的預設默認值vcDayProfile能夠在初始時(即在定義間隔以前)經過相應的設置進行修改。
配置文件類型建議容許的間隔類型。例如,日期配置文件始終須要vcDayProfileInterval類型的間隔。
日曆配置文件能夠顯示類型爲日配置文件、周配置文件、年配置文件和變量配置文件。在一天配置文件中,只能經過在一天的限制範圍內的時鐘時間來定義間隔。一週配置文件包含要在某些天應用的日期配置文件。年份配置文件分配選定的一天配置文件,這些配置文件適用於單個重複日期或幾個重複日期。變量配置文件包含一系列不一樣的工做時間。根據間隔類型vcCalendarInterval,vcDayProfileInterval,vcWeekProfileInterval,vcYearProfileInterval和vcVariableProfileInterval,僅對象的某些屬性是相關的。下表映射了概要文件類型和相關屬性。
CalendarInterval在精肯定義的間隔中描述了惟一的時間跨度。例:2010年5月5日從11:30時到2010年9月15日17:00時。
YearProfileInterval容許定義每一年重複一次的天數或時間跨度。例:5月1日或12月24日至26日。
WeekProfileInterval處理一週中的一天或幾天。例:星期六或星期一至星期五。
DayProfileInterval處理一天以內的時間規格。例:8.00至17.00。
VariableProfile描述了時間跨度,而不引用定義的日期或時間。時間間隔的單位能夠是天、小時、分鐘或秒,而且由時間間隔對象的屬性TimeUnit指定。例:4小時。
如何使用日曆進行計算
日曆中的計算不必定在時間範圍內可見。對象日曆的AddDuration方法從開始日期和指定的工做時間單位數計算最終日期,同時考慮到非工做時間。傳遞負號的時間單位將致使從給定的結束日期開始計算開始日期。 CalcDuration方法是AddDuration方法的補充,它從給定的開始日期和結束日期計算工做時間單位(持續時間)數。
計算方法是如何工做的
請注意:指定爲天、小時、分鐘或秒的工做時間單位必須與VcGantt對象的屬性TimeUnit定義的時間單位相對應。
AddDuration方法可確保所計算的日期始終位於工做時間間隔內。同時,若是源值位於非工做時間內,則後向計算不必定提供與前向計算的源值相等的結果。
計算的有限可逆性
以交互方式建立或修改活動時,VARCHART XGantt會自動注意活動沒法在非工做時間內開始或結束。若是但願經過API建立或修改節點時行爲保持一致,則須要經過手動更正開始日期或結束日期來確保這一點。爲此,位於非工做時間中的開始日期須要移動到下一個工做時間間隔的開始,而且結束日期對應於上一個工做時間間隔的結束。有一些方法能夠肯定間隔的極限。
示例代碼
If calendar.IsWorktime(StartDate) = False Then StartDate = calendar.GetNextIntervalBorder(StartDate) End If If calendar.IsWorktime(EndDate) = False Then EndDate = calendar.GetNextIntervalBorder(EndDate) End If
夏令時
VARCHART XGantt自動支持夏令時。在中歐,DST從3月的最後一個星期日開始,到10月的最後一個星期日結束。在夏令時開始時,時鐘從2:00 h延遲到3:00 h,在時鐘結束時從3:00 h延遲到2:00 h。
夏令時開始:
夏令時結束:
若是將TimeUnit設置爲小時,則在夏時制的開始日期,方法calcDuration檢索23小時的時間跨度,而在最後一天,則返回25小時。若是設置爲天,則兩種狀況下的時間跨度均爲1天。
檢索時間間隔的限制
Calendar對象用於檢索時間間隔GetStartOfInterval、GetNextIntervalBorder和GetPreviousIntervalBorder的限制的方法,容許迭代工做時間間隔和非工做時間間隔。返回的結果是相對的,並以方法做爲參數傳遞的參考日期爲參考。
能夠經過Calendar對象的IsWorkTime方法檢查日期是否在工做時間或非工做時間。儘管新間隔的開始日期等於上一個間隔的結束日期,可是開始日期始終屬於新間隔(向右打開)。
方法GetEndOfPreviousWorkTime和GetStartOfNextWorkTime不提供新的選項,而只是簡化了工做時間間隔的處理。
在下面的編程示例中,將檢索日曆的時間間隔並將其寫入文件。此外,計算給按期間內可用的工做時間:
示例代碼
Private Sub writeCalendarIntervalsToFile(ByVal filename As String, ByVal calendar As VcCalendar, ByVal startDate As Date, ByVal endDate As Date, ByVal listWorkIntervals As Boolean, ByVal listNonWorkIntervals As Boolean) Dim tmpStartDate As Date Dim nextStartDate As Date Dim totalWorkTime As Integer Open filename For Output As #1 Print #1, "Time Intervals of " & calendar.Name & "between " & startDate & " - " & endDate tmpStartDate = startDate Do While tmpStartDate < endDate nextStartDate = calendar.GetNextIntervalBorder(tmpStartDate) If tmpStartDate = nextStartDate Then nextStartDate = endDate End If If nextStartDate > endDate Then nextStartDate = endDate End If If calendar.IsWorktime(tmpStartDate) Then If listWorkIntervals Then Print #1, "WorkInterval" & " " & tmpStartDate & " " & nextStartDate End If Else If listNonWorkIntervals Then Print #1, "NonWorkInterval" & " " & tmpStartDate & " " & nextStartDate End If End If tmpStartDate = nextStartDate Loop totalWorkTime = calendar.CalcDuration(startDate, endDate) Print #1, "Total work time: " & totalWorkTime & " Units" Close #1 End Sub
請注意:日曆中的時間間隔能夠精確地指定爲秒,而且最多能夠包含137年(以秒爲單位)的間隔。
將時間間隔寫入文件的代碼
示例代碼
Call writeCalendarIntervalsToFile("C:\text.txt", calendar, VcGantt1.TimeScaleStart, VcGantt1.TimeScaleEnd, True, True) Time Intervals of CompanyCalendar_1 between 01.01.2011 00:00:00 - 01.01.2012 00:00:00 01.01.2011 00:00:00 - 02.01.2011 00:00:00 non-work time 02.01.2011 00:00:00 - 03.01.2011 00:00:00 non-work time 03.01.2011 00:00:00 - 03.01.2011 08:00:00 non-work time 03.01.2011 08:00:00 - 03.01.2011 12:00:00 work time 03.01.2011 12:00:00 - 03.01.2011 13:00:00 non-work time 03.01.2011 13:00:00 - 03.01.2011 17:00:00 work time 03.01.2011 17:00:00 - 04.01.2011 00:00:00 non-work time 04.01.2011 00:00:00 - 04.01.2011 08:00:00 non-work time 04.01.2011 08:00:00 - 04.01.2011 12:00:00 work time 04.01.2011 12:00:00 - 04.01.2011 13:00:00 non-work time 04.01.2011 13:00:00 - 04.01.2011 17:00:00 work time 04.01.2011 17:00:00 - 05.01.2011 00:00:00 non-work time ... 30.12.2011 00:00:00 - 30.12.2011 08:00:00 non-work time 30.12.2011 08:00:00 - 30.12.2011 12:00:00 work time 30.12.2011 12:00:00 - 30.12.2011 13:00:00 non-work time 30.12.2011 13:00:00 - 30.12.2011 17:00:00 work time 30.12.2011 17:00:00 - 31.12.2011 00:00:00 non-work time 31.12.2011 00:00:00 - 01.01.2012 00:00:00 non-work time Total work time: 2064 Units
本教程內容到這裏就完結了,感興趣的朋友能夠繼續關注咱們哦~