翻譯|行業資訊|編輯:黃竹雯|2018-12-26 17:02:58.000|閱讀 418 次
概述:文章主要介紹關于VARCHART XGantt .NET的最佳實踐之通過表交互式完成交換任務
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
VARCHART XGantt是一款功能強大的甘特圖控件,其模塊化的設計讓您可以創建滿足需要的應用程序。XGantt可用于.NET,ActiveX和ASP.NET應用程序,可以快速、簡單地集成到您的應用程序中,幫助您識別性能瓶頸、避免延遲以及高效利用資源,使復雜數據變得更加容易理解。
本文主要通過利用VARCHART XGantt來處理文章提及的可能發生的情況,向大家展示VARCHART XGantt.NET的最佳實踐,即通過表交互式交換任務。
客戶已經開發出一個圖形規劃板,用于使用VARCHART XGantt管理他的機器。任務在機器上按順序運行,沒有緩沖時間。在計劃表的表格區域中,任務按開始日期排序,相應地按順序列出。這在甘特區顯示為“下降樓梯”。
客戶希望能夠僅在表區域中通過拖放更改機器內的任務順序。從技術上講,這個問題必須通過制作一個已經在表格中移動的任務來實現。需要相應地改變任務的進程順序,如下所示:
移動前
移動后
在VARCHART XGantt中以交互方式移動節點會觸發事件VcNodeModifying和VcNodeModifiedEx。
VcNodemodifying首先檢查任務是否已被移動到另一個組,因為根據規范這是違規的。需要檢查在移動任務之后其機器數據字段的內容是否已經改變。如果內容已更改,則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