翻譯|使用教程|編輯:黃竹雯|2018-10-24 17:03:05.000|閱讀 392 次
概述:本文將告訴您VARCHART XGantt .NET最佳實踐:通過表交互式交換任務。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
VARCHART XGantt是一款功能強大的Gantt控件(.NET和ActiveX版),可讓您輕松創建智能甘特圖。最近,我們的一位客戶聯系了我們,他遇到了一個非常復雜的問題,希望我們可以幫助他解決。我確信其他使用VARCHART XGantt的開發人員也會對我們提出的方法感興趣,因此我決定簡要介紹一下問題及其解決方案。
該方法涉及通過表交互式交換任務,因此,調整它們必須處理的順序。
客戶已經開發出一個圖形規劃板,用于使用VARCHART XGantt .NET版管理他的機器。在機器上,任務按順序運行,沒有緩沖時間。在計劃表的表格區域中,相應地列出了任務,這些任務按開始日期排序。這在甘特區顯示為“下降樓梯”。
客戶希望能夠通過拖放和僅在表區域中更改機器內的任務順序。從技術上講,這個問題必須通過制作一個已經在表格中移動的任務來實現,例如,已經放置它的任務的前身(及時)。為此,需要相應地改變任務的進程順序。例如,如果任務2和任務3必須交換,則應如下所示:
移動前:
移動后:
在VARCHART XGantt中以交互方式移動節點會觸發事件VcNodeModifying和VcNodeModifiedEx。
VcNodemodifying首先檢查任務是否已被移動到另一個組,因為根據規范,這不應該被允許。為了實現這一點,需要檢查,無論是在移動任務之后,其Machine數據字段(分組字段)的內容是否已經改變。如果內容已更改,則ReturnStatus將設置為vcRetStatFalse,從而撤消移動。在這種情況下,事件VcNodeModifiedEx將不會出現。
private void vcGantt1_VcNodeModifying(object sender, VcNodeModifyingEventArgs e) { //Make sure that a task cannot be moved to another machine string oldGroupName = e.OldNode.get_DataField(eMainData.Machine).ToString(); string newGroupName = e.Node.get_DataField(eMainData.Machine).ToString(); e.ReturnStatus = oldGroupName == newGroupName ? VcReturnStatus.vcRetStatDefault : VcReturnStatus.vcRetStatFalse; }
如果允許移動任務(任務在其組內移動),則必須重新安排任務。這是通過搜索組中所有任務的最早開始日期在 VcNodeModifiedEx 事件中完成的。然后,您再次運行該組的所有任務,并重新計算其開始和結束日期,從最早的開始日期開始,并考慮相應的機器日歷。在VcNodeCollection nodesInGroup中(請參閱代碼!),節點按表中顯示的順序列出。
private void vcGantt1_VcNodeModifiedEx(object sender, VcNodeModifiedExEventArgs e) { DateTime minStartDate = DateTime.MaxValue; DateTime startDate; DateTime endDate; VcCalendar cal = vcGantt1.CalendarCollection.CalendarByName(e.Node.get_DataField(eMainData.Machine).ToString()); VcNodeCollection nodesInGroup = e.Node.SuperGroup.NodeCollection; //Mark the moved node as "moved" e.Node.set_DataField(eMainData._Moved, "1"); e.Node.Update(); //Search for the earliest start date of the nodes in the group foreach (VcNode node in nodesInGroup) { startDate = Convert.ToDateTime(node.get_DataField(eMainData.Start)); minStartDate = (startDate < minStartDate ? startDate : minStartDate); } startDate = minStartDate; //Reposition the tasks on the machine so that they follow each other //without gaps or overlaps. vcGantt1.SuspendUpdate(true); foreach (VcNode node in nodesInGroup) { endDate = cal.AddDuration(startDate, Convert.ToInt32(node.get_DataField(eMainData.Duration))); node.set_DataField(eMainData.Start, startDate); node.set_DataField(eMainData.End, endDate); node.Update(); startDate = (cal.IsWorktime(endDate) ? endDate : cal.GetStartOfNextWorktime(endDate)); } vcGantt1.SuspendUpdate(false); }
重新計算日期后,任務將再次顯示為降序樓梯。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn