翻譯|使用教程|編輯:黃竹雯|2018-10-24 17:03:05.000|閱讀 392 次
概述:本文將告訴您VARCHART XGantt .NET最佳實(shí)踐:通過表交互式交換任務(wù)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
VARCHART XGantt是一款功能強(qiáng)大的Gantt控件(.NET和ActiveX版),可讓您輕松創(chuàng)建智能甘特圖。最近,我們的一位客戶聯(lián)系了我們,他遇到了一個(gè)非常復(fù)雜的問題,希望我們可以幫助他解決。我確信其他使用VARCHART XGantt的開發(fā)人員也會對我們提出的方法感興趣,因此我決定簡要介紹一下問題及其解決方案。
該方法涉及通過表交互式交換任務(wù),因此,調(diào)整它們必須處理的順序。
客戶已經(jīng)開發(fā)出一個(gè)圖形規(guī)劃板,用于使用VARCHART XGantt .NET版管理他的機(jī)器。在機(jī)器上,任務(wù)按順序運(yùn)行,沒有緩沖時(shí)間。在計(jì)劃表的表格區(qū)域中,相應(yīng)地列出了任務(wù),這些任務(wù)按開始日期排序。這在甘特區(qū)顯示為“下降樓梯”。
客戶希望能夠通過拖放和僅在表區(qū)域中更改機(jī)器內(nèi)的任務(wù)順序。從技術(shù)上講,這個(gè)問題必須通過制作一個(gè)已經(jīng)在表格中移動(dòng)的任務(wù)來實(shí)現(xiàn),例如,已經(jīng)放置它的任務(wù)的前身(及時(shí))。為此,需要相應(yīng)地改變?nèi)蝿?wù)的進(jìn)程順序。例如,如果任務(wù)2和任務(wù)3必須交換,則應(yīng)如下所示:
移動(dòng)前:
移動(dòng)后:
在VARCHART XGantt中以交互方式移動(dòng)節(jié)點(diǎn)會觸發(fā)事件VcNodeModifying和VcNodeModifiedEx。
VcNodemodifying首先檢查任務(wù)是否已被移動(dòng)到另一個(gè)組,因?yàn)楦鶕?jù)規(guī)范,這不應(yīng)該被允許。為了實(shí)現(xiàn)這一點(diǎn),需要檢查,無論是在移動(dòng)任務(wù)之后,其Machine數(shù)據(jù)字段(分組字段)的內(nèi)容是否已經(jīng)改變。如果內(nèi)容已更改,則ReturnStatus將設(shè)置為vcRetStatFalse,從而撤消移動(dòng)。在這種情況下,事件VcNodeModifiedEx將不會出現(xiàn)。
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; }
如果允許移動(dòng)任務(wù)(任務(wù)在其組內(nèi)移動(dòng)),則必須重新安排任務(wù)。這是通過搜索組中所有任務(wù)的最早開始日期在 VcNodeModifiedEx 事件中完成的。然后,您再次運(yùn)行該組的所有任務(wù),并重新計(jì)算其開始和結(jié)束日期,從最早的開始日期開始,并考慮相應(yīng)的機(jī)器日歷。在VcNodeCollection nodesInGroup中(請參閱代碼!),節(jié)點(diǎn)按表中顯示的順序列出。
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); }
重新計(jì)算日期后,任務(wù)將再次顯示為降序樓梯。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn