翻譯|使用教程|編輯:黃竹雯|2018-10-24 17:03:05.000|閱讀 400 次
概述:本文將告訴您VARCHART XGantt .NET最佳實踐:通過表交互式交換任務(wù)。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
VARCHART XGantt是一款功能強大的Gantt控件(.NET和ActiveX版),可讓您輕松創(chuàng)建智能甘特圖。最近,我們的一位客戶聯(lián)系了我們,他遇到了一個非常復(fù)雜的問題,希望我們可以幫助他解決。我確信其他使用VARCHART XGantt的開發(fā)人員也會對我們提出的方法感興趣,因此我決定簡要介紹一下問題及其解決方案。
該方法涉及通過表交互式交換任務(wù),因此,調(diào)整它們必須處理的順序。
客戶已經(jīng)開發(fā)出一個圖形規(guī)劃板,用于使用VARCHART XGantt .NET版管理他的機器。在機器上,任務(wù)按順序運行,沒有緩沖時間。在計劃表的表格區(qū)域中,相應(yīng)地列出了任務(wù),這些任務(wù)按開始日期排序。這在甘特區(qū)顯示為“下降樓梯”。

客戶希望能夠通過拖放和僅在表區(qū)域中更改機器內(nèi)的任務(wù)順序。從技術(shù)上講,這個問題必須通過制作一個已經(jīng)在表格中移動的任務(wù)來實現(xiàn),例如,已經(jīng)放置它的任務(wù)的前身(及時)。為此,需要相應(yīng)地改變?nèi)蝿?wù)的進(jìn)程順序。例如,如果任務(wù)2和任務(wù)3必須交換,則應(yīng)如下所示:
移動前:

移動后:

在VARCHART XGantt中以交互方式移動節(jié)點會觸發(fā)事件VcNodeModifying和VcNodeModifiedEx。
VcNodemodifying首先檢查任務(wù)是否已被移動到另一個組,因為根據(jù)規(guī)范,這不應(yīng)該被允許。為了實現(xiàn)這一點,需要檢查,無論是在移動任務(wù)之后,其Machine數(shù)據(jù)字段(分組字段)的內(nèi)容是否已經(jīng)改變。如果內(nèi)容已更改,則ReturnStatus將設(shè)置為vcRetStatFalse,從而撤消移動。在這種情況下,事件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;
}
如果允許移動任務(wù)(任務(wù)在其組內(nèi)移動),則必須重新安排任務(wù)。這是通過搜索組中所有任務(wù)的最早開始日期在 VcNodeModifiedEx 事件中完成的。然后,您再次運行該組的所有任務(wù),并重新計算其開始和結(jié)束日期,從最早的開始日期開始,并考慮相應(yīng)的機器日歷。在VcNodeCollection nodesInGroup中(請參閱代碼!),節(jié)點按表中顯示的順序列出。
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);
}
重新計算日期后,任務(wù)將再次顯示為降序樓梯。

本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn