VARCHART XGantt_v5.1用戶手冊(cè):如何計(jì)算活動(dòng)結(jié)束日期(.NET版)
VARCHART XGantt是一個(gè)交互式的甘特圖控件,其模塊化的設(shè)計(jì)讓您可以創(chuàng)建滿足您和您的客戶所需求的應(yīng)用程序。(我們領(lǐng)先的甘特圖控件VARCHART XGantt可用于.NET,ActiveX和ASP.NET應(yīng)用程序。)除此之外,同時(shí)還具有一個(gè)穩(wěn)定可靠的甘特圖工具,在編寫第一行代碼之前,您就可以知道是否可以滿足客戶的需求。
點(diǎn)擊下載VARCHART XGantt免費(fèi)版
本文主要介紹如何通過VARCHART XGantt計(jì)算活動(dòng)結(jié)束日期(.NET版),想要嘗試一下的朋友們可以按照教程內(nèi)容操作哦~
保存結(jié)束日期的表列仍為空。可以使用VARCHART XGantt中包含的日歷從“開始”和“持續(xù)時(shí)間”字段計(jì)算活動(dòng)的結(jié)束。
在默認(rèn)日歷中,工作日(周一至周五)預(yù)先定義為活動(dòng)時(shí)間,周末(周六和周日)定義為非活動(dòng)時(shí)間。
您可以通過灰色背景識(shí)別圖中的非活動(dòng)時(shí)間。可以通過在“節(jié)點(diǎn)”屬性頁面上停用“使用日歷”選項(xiàng)節(jié)點(diǎn)來關(guān)閉日歷。
請(qǐng)注意使用時(shí)和不使用日歷時(shí)的計(jì)算差異:
活動(dòng)從周五開始并持續(xù)3天,如果日歷被激活,活動(dòng)將在星期二結(jié)束。沒有日歷,活動(dòng)將在周日結(jié)束。
可以使用對(duì)象VcCalendar的AddDuration(...)方法計(jì)算結(jié)束日期。這需要每個(gè)活動(dòng)的開始和持續(xù)時(shí)間。可以通過索引訪問這些字段。在通過方法set_DataField(...)設(shè)置結(jié)束日期之后,需要調(diào)用VcNode的Update()方法來顯示修改。
示例代碼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()
示例代碼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();
通過鼠標(biāo)交互創(chuàng)建或修改的活動(dòng)的開始和結(jié)束日期將自動(dòng)置于活動(dòng)時(shí)間。
相反,API或編輯對(duì)話框設(shè)置的日期可以放置在非工作時(shí)間。
通過計(jì)算生成的日期始終處于工作時(shí)間。
為了確保API設(shè)置的日期處于工作時(shí)間,需要從結(jié)束日期和活動(dòng)持續(xù)時(shí)間計(jì)算開始日期。
示例代碼VB.NET
tmpDate = tmpCal.AddDuration(node.DataField(3), (-1) * node.DataField(4)) node.DataField(2) = tmpDate
示例代碼C#
tmpDate = tmpCal.AddDuration((DateTime)node.get_DataField(3),(-1) * Convert.ToInt32(node.get_DataField(4))); node.set_DataField(2, tmpDate);
為了保持?jǐn)?shù)據(jù)的一致性,丟失或負(fù)的持續(xù)時(shí)間應(yīng)視為不正確,并重置為0。如果缺少開始日期,則無法計(jì)算結(jié)束日期。代碼在名為SetNodeEndDate(...)的單獨(dú)方法中恢復(fù)。
示例代碼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
示例代碼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(); } }
需要計(jì)算日期:
1、活動(dòng)結(jié)束后
2、通過數(shù)據(jù)編輯對(duì)話框或就地編輯器修改日期或持續(xù)時(shí)間之后
3、API修改活動(dòng)值后
然而,在通過鼠標(biāo)交互進(jìn)行修改之后,不需要啟動(dòng)計(jì)算,因?yàn)樵谶@種情況下,將自動(dòng)執(zhí)行內(nèi)部計(jì)算。
可以通過VcGantt對(duì)象的屬性NodeCollection來設(shè)置包括所有節(jié)點(diǎn)的計(jì)算循環(huán)。它的代碼將被添加到事件Form1_Load(...)的末尾。
示例代碼VB.NET
'Calculate end date for all nodes Dim node As VcNode For Each node In VcGantt1.NodeCollection SetNodeEndDate node Next
示例代碼C#
// Calculate end date for all nodes foreach (VcNode node in vcGantt1.NodeCollection) { SetNodeEndDate(node); }
VcNodeModified事件可以拾取用戶引起的數(shù)據(jù)更改。添加的方法調(diào)用將計(jì)算結(jié)束日期。
示例代碼VB.NET
Private Sub VcGantt1_VcNodeModified(ByVal sender As Object, ByVal e As NETRONIC.XGantt.VcNodeModifiedEventArgs) Handles VcGantt1.VcNodeModified SetNodeEndDate(e.Node) End Sub
示例代碼C#
private void vcGantt1_VcNodeModified(object sender, NETRONIC.XGantt.VcNodeModifiedEventArgs e) { SetNodeEndDate(e.Node); }
如果API更改了數(shù)據(jù)值,則必須顯式調(diào)用方法SetNodeEndDate(...)。
想要購買VARCHART XGantt正版授權(quán),或了解更多產(chǎn)品信息請(qǐng)點(diǎn)擊“咨詢?cè)诰€客服”
掃描關(guān)注慧聚IT微信公眾號(hào),及時(shí)獲取最新動(dòng)態(tài)及最新資訊