保存結束日期的表列仍然為空。一個活動的結束可以使用 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);
為了保持數據的一致性,缺失或負的持續時間應被視為不適當,並被重置為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(); } }
需要計算日期:
1. 活動加載后
2. 日期或持續時間被數據編輯對話框或就地編輯器修改后
3.活動值被API修改后
但是,經過鼠標交互修改后,不需要啟動計算,因為在這種情況下,內部計算將自動執行。
通過VcGantt對象的屬性節點集合,可以建立一個包含所有節點的計算循環。它的代碼將被添加到事件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(…)。
APS幫助提升企業生產效率,真正實現生產計划可視化呈現與控制,快速有效響應不同場景的生產計划,提高准時交貨能力,提高產能和資源利用率
想要了解甘特圖或慧都APS系統,請登錄慧都網咨詢在線客服,解決您的問題!
本文章轉載自【慧都科技】evget歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,尊重他人勞動成果