原創|使用教程|編輯:郝浩|2013-04-02 11:51:35.000|閱讀 1062 次
概述:通常情況下甘特圖表列的結束日期是空的,甘特圖控件VARCHART XGantt的日歷功能可以從活動的開始日期和持續時間計算活動的結束日期。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
通常情況下甘特圖表列的結束日期是空的,甘特圖控件VARCHART XGantt的日歷功能可以從活動的開始日期和持續時間計算活動的結束日期
甘特圖在默認的日歷中,工作日(星期一到星期五)是預先定義的活動時間,周末(星期六和星期天)則為非活動的時間。你可以通過甘特圖中的灰色背景來識別非活動時間。使用禁用日歷節點屬性頁上的節點選項可以關閉日歷。
請注意甘特圖日歷在使用和不使用時計算的差異:如果日歷被激活,一個從上周五開始的持續3天的活動,它將在星期二結束,但是如果沒有激活日歷的話,這個活動將在星期天結束。
結束日期的計算一般使用VcCalendar對象的AddDuration(...)方法。這個過程需要每個活動的開始和持續時間。通過其索引字段可以訪問。通過方法set_DataField(...)設置結束日期后,要顯示的話還需要調用VcNode的Update()方法。
Example Code VB.NET
Dim tmpCal As VcCalendar Dim tmpDate As Date Set tmpCal = VcGantt1.CalendarCollection.Active tmpDate = tmpCalendar.AddDuration(node.DataField(2), node.DataField(4)) node.DataField(3) = tmpDate node.Update()
Example Code C#
VcCalendar tmpCal = vcGantt1.CalendarCollection.Active; DateTime tmpDate = tmpCal.AddDuration((DateTime)node.get_DataField(2), Convert.ToInt32(node.get_DataField(4))); node.set_DataField(3, tmpDate); node.Update();
活動的開始和結束日期通過鼠標交互創建或修改,自動放置在活動時間中。
相反,通過API或編輯對話框設置的日期可以放置在非工作時間。
通過計算生成的日期總是被置于工作時間中。為了確保通過API設置的日期被放置在工作時間內,開始時間需要通過結束日期和活動持續時間來計算。
Example Code VB.NET
tmpDate = tmpCal.AddDuration(node.DataField(3), (-1) * node.DataField(4)) node.DataField(2) = tmpDate
Example Code C#
tmpDate = tmpCal.AddDuration((DateTime)node.get_DataField(3),(-1) * Convert.ToInt32(node.get_DataField(4))); node.set_DataField(2, tmpDate);
為了保持數據的一致性,在甘特圖控件VARCHART XGantt中丟失或負的持續時間應視為不當數據,將被重置為0。如果缺少的開始日期,結束日期將無法計算。代碼將在一個單獨的名為SetNodeEndDate(...)的方法中被恢復。
Example Code VB.NET
Private Sub SetNodeEndDate(ByVal node As VcNode) 'Avoid empty duration or negative duration If node.DataField(4) = "" Or node.DataField(4) < 0 Then node.DataField(4) = "0" End If 'Start date empty then end date should also be empty If node.DataField(2) = "31.12.1899 00:00:00" Then node.DataField(3) = "" Else 'Precondition is property page nodes '"Assign calendar to nodes" must be true Dim tmpCal As VcCalendar tmpCal = VcGantt1.CalendarCollection.Active Dim tmpDate As DateTime tmpDate = tmpCal.AddDuration(node.DataField(2), node.DataField(4)) node.DataField(3) = tmpDate 'Start date only in active times tmpDate = tmpCal.AddDuration(node.DataField(3), (-1) * node.DataField(4)) node.DataField(2) = tmpDate node.Update() End If End Sub
Example Code C#
private void SetNodeEndDate(VcNode node) { // Avoid empty duration or negative duration if ((string) node.get_DataField(4) == "" || Convert.ToInt32(node.get_DataField(4)) < 0) node.set_DataField(4,"0"); // Start Date empty then end date should also be empty if (node.get_DataField(2).ToString() == "31.12.1899 00:00:00") node.set_DataField(3,""); else { // Precondition in property page nodes // "Assign calendar to nodes" must be true VcCalendar tmpCal = vcGantt1.CalendarCollection.Active; DateTime tmpDate = tmpCal.AddDuration( (DateTime)node.get_DataField(2), Convert.ToInt32(node.get_DataField(4))); node.set_DataField(3, tmpDate); // start date only in active times tmpDate = tmpCal.AddDuration((DateTime)node.get_DataField(3), (-1) * Convert.ToInt32(node.get_DataField(4))); node.set_DataField(2, tmpDate); node.Update(); } }
日期計算的幾條要求:
一個包括所有節點的計算循環可以被VcGantt對象的NodeCollection屬性設置。它的代碼將被添加到Form1_Load(...)事件的末尾。
Example Code VB.NET
'Calculate end date for all nodes Dim node As VcNode For Each node In VcGantt1.NodeCollection SetNodeEndDate node Next
Example Code C#
// Calculate end date for all nodes foreach (VcNode node in vcGantt1.NodeCollection) { SetNodeEndDate(node); }
由用戶引起的數據改變可以由VcNodeModified事件獲取。被添加的調用方法將計算結束日期。
Example Code VB.NET
Private Sub VcGantt1_VcNodeModified(ByVal sender As Object, ByVal e As NETRONIC.XGantt.VcNodeModifiedEventArgs) Handles VcGantt1.VcNodeModified SetNodeEndDate(e.Node) End Sub
Example Code C#
private void vcGantt1_VcNodeModified(object sender, NETRONIC.XGantt.VcNodeModifiedEventArgs e) { SetNodeEndDate(e.Node); }
如果數據的值被API修改,SetNodeEndDate(...)方法將顯示調用。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網