VARCHART XGantt是一个交互式的甘特图控件,其模块化的设计让您可以创建满足您和您的客户所需求的应用程序。可以快速、简单地集成到您的应用程序中,帮助您识别性能瓶颈、避免延迟以及高效利用资源,使复杂数据变得更加容易理解。

本篇文章主要解释了VARCHART XGantt如何计算活动结束时间,感兴趣的朋友可以自己动手操作一下哦~

结束日期的表列仍为空。可以在VARCHART XGantt中包含的日历的帮助下,从“开始”和“持续时间”字段计算活动的结束。

在默认日历中,工作日(星期一到星期五)被定义为活动时间,而周末(星期六和星期日)被定义为非活动时间。

在图中,您可以通过灰色背景识别非活动时间。可以通过在“节点”属性页上停用“将日历分配给节点”选项来关闭日历。

请注意有无日历计算的差异:

活动从星期五开始并持续3天,如果日历被激活,活动将在星期二结束。没有日历,活动将在周日结束。

结束日期通过对象VcCalendar的AddDuration(...)方法计算。因此,需要每项活动的开始和持续时间。可以通过索引从相应的数据字段中检索它们。在通过DataField(...)方法设置结束日期之后,必须调用VcNode的UpdateNode方法,以便可以看到数据的更改。

示例代码

Dim tmpCal As VcCalendar
Dim tmpDate As Date
Set tmpCal = VcGantt1.CalendarCollection.Active
tmpDate = tmpCal.AddDuration(node.DataField(2), node.DataField(4))
node.DataField(3) = tmpDate
node.UpdateNode

通过鼠标交互创建或修改的活动的开始和结束日期将自动置于活动时间。

QQ截图20190827144111.png

相反,API或编辑对话框设置的日期可以放置在非工作时间。

QQ截图20190827144136.png

通过计算生成的日期始终位于工作时间内。为了确保API设置的日期处于工作时间,需要从结束日期和活动持续时间计算开始日期。

示例代码

tmpDate = tmpCal.AddDuration(node.DataField(3), _
 (-1) * node.DataField(4))
node.DataField(2) = tmpDate

为了保持数据的一致性,丢失或负持续时间应视为不正确,并重置为0。如果缺少开始日期,则无法计算结束日期。所需的代码总结为一个名为SetNodeEndDate(...)的单独方法。

示例代码

Private Sub SetNodeEndDate(ByVal node As VcNode)
 'Avoid empty 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
 Dim tmpDate As Date
 Set tmpCal = VcGantt1.CalendarCollection.Active
 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.UpdateNode
 End If
End Sub

需要计算日期:

1、活动结束后

2、通过数据编辑对话框或就地编辑器修改日期或持续时间之后

3.、API修改活动值后

然而,在通过鼠标交互进行修改之后,不必启动计算,因为这将自动执行内部计算。

可以通过VcGantt对象的属性NodeCollection来设置包括所有节点的计算循环。它的代码将被添加到事件Form1_Load(...)的末尾。

示例代码

'Calculate end date for all nodes
Dim node As VcNode
For Each node In VcGantt1.NodeCollection
 SetNodeEndDate node
Next

可以通过事件OnNodeModifyComplete捕获用户引起的数据更改。方法调用执行结束日期的计算。

示例代码

Private Sub VcGantt1_OnNodeModifyComplete _
 (ByVal node As VcGanttLib.VcNode, _
 ByVal isLastNodeInSeries As Boolean)
 SetNodeEndDate node
End Sub

如果数据已通过API更改,则必须调用SetNodeEndDate(...)