原創(chuàng)|使用教程|編輯:郝浩|2013-04-02 11:51:35.000|閱讀 1073 次
概述:通常情況下甘特圖表列的結(jié)束日期是空的,甘特圖控件VARCHART XGantt的日歷功能可以從活動的開始日期和持續(xù)時間計算活動的結(jié)束日期。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
通常情況下甘特圖表列的結(jié)束日期是空的,甘特圖控件VARCHART XGantt的日歷功能可以從活動的開始日期和持續(xù)時間計算活動的結(jié)束日期
甘特圖在默認(rèn)的日歷中,工作日(星期一到星期五)是預(yù)先定義的活動時間,周末(星期六和星期天)則為非活動的時間。你可以通過甘特圖中的灰色背景來識別非活動時間。使用禁用日歷節(jié)點(diǎn)屬性頁上的節(jié)點(diǎn)選項可以關(guān)閉日歷。
請注意甘特圖日歷在使用和不使用時計算的差異:如果日歷被激活,一個從上周五開始的持續(xù)3天的活動,它將在星期二結(jié)束,但是如果沒有激活日歷的話,這個活動將在星期天結(jié)束。
結(jié)束日期的計算一般使用VcCalendar對象的AddDuration(...)方法。這個過程需要每個活動的開始和持續(xù)時間。通過其索引字段可以訪問。通過方法set_DataField(...)設(shè)置結(jié)束日期后,要顯示的話還需要調(diào)用VcNode的Update()方法。
Example Code 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()
Example Code 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();
活動的開始和結(jié)束日期通過鼠標(biāo)交互創(chuàng)建或修改,自動放置在活動時間中。

相反,通過API或編輯對話框設(shè)置的日期可以放置在非工作時間。

通過計算生成的日期總是被置于工作時間中。為了確保通過API設(shè)置的日期被放置在工作時間內(nèi),開始時間需要通過結(jié)束日期和活動持續(xù)時間來計算。
Example Code VB.NET
tmpDate = tmpCal.AddDuration(node.DataField(3),
(-1) * node.DataField(4))
node.DataField(2) = tmpDate
Example Code 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ù)的一致性,在甘特圖控件VARCHART XGantt中丟失或負(fù)的持續(xù)時間應(yīng)視為不當(dāng)數(shù)據(jù),將被重置為0。如果缺少的開始日期,結(jié)束日期將無法計算。代碼將在一個單獨(dú)的名為SetNodeEndDate(...)的方法中被恢復(fù)。
Example Code 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
Example Code 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();
}
}
日期計算的幾條要求:
一個包括所有節(jié)點(diǎn)的計算循環(huán)可以被VcGantt對象的NodeCollection屬性設(shè)置。它的代碼將被添加到Form1_Load(...)事件的末尾。
Example Code VB.NET
'Calculate end date for all nodes Dim node As VcNode For Each node In VcGantt1.NodeCollection SetNodeEndDate node Next
Example Code C#
// Calculate end date for all nodes
foreach (VcNode node in vcGantt1.NodeCollection)
{
SetNodeEndDate(node);
}
由用戶引起的數(shù)據(jù)改變可以由VcNodeModified事件獲取。被添加的調(diào)用方法將計算結(jié)束日期。
Example Code VB.NET
Private Sub VcGantt1_VcNodeModified(ByVal sender As Object, ByVal e As
NETRONIC.XGantt.VcNodeModifiedEventArgs) Handles VcGantt1.VcNodeModified
SetNodeEndDate(e.Node)
End Sub
Example Code C#
private void vcGantt1_VcNodeModified(object sender,
NETRONIC.XGantt.VcNodeModifiedEventArgs e)
{
SetNodeEndDate(e.Node);
}
如果數(shù)據(jù)的值被API修改,SetNodeEndDate(...)方法將顯示調(diào)用。

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