彩票走势图

XGantt甘特图开发教程:如何计算结束日期

原创|使用教程|编辑:郝浩|2013-04-02 11:51:35.000|阅读 998 次

概述:通常情况下甘特图表列的结束日期是空的,甘特图控件VARCHART XGantt的日历功能可以从活动的开始日期和持续时间计算活动的结束日期。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:

通常情况下甘特图表列的结束日期是空的,甘特图控件VARCHART XGantt的日历功能可以从活动的开始日期和持续时间计算活动的结束日期

甘特图在默认的日历中,工作日(星期一到星期五)是预先定义的活动时间,周末(星期六和星期天)则为非活动的时间。你可以通过甘特图中的灰色背景来识别非活动时间。使用禁用日历节点属性页上的节点选项可以关闭日历。

请注意甘特图日历在使用和不使用时计算的差异:如果日历被激活,一个从上周五开始的持续3天的活动,它将在星期二结束,但是如果没有激活日历的话,这个活动将在星期天结束。

结束日期的计算一般使用VcCalendar对象的AddDuration(...)方法。这个过程需要每个活动的开始和持续时间。通过其索引字段可以访问。通过方法set_DataField(...)设置结束日期后,要显示的话还需要调用VcNodeUpdate()方法。

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();

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

XGantt甘特图开发教程:如何计算结束日期

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

XGantt甘特图开发教程:如何计算结束日期

通过计算生成的日期总是被置于工作时间中。为了确保通过API设置的日期被放置在工作时间内,开始时间需要通过结束日期和活动持续时间来计算。

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);

为了保持数据的一致性,在甘特图控件VARCHART XGantt中丢失或负的持续时间应视为不当数据,将被重置为0。如果缺少的开始日期,结束日期将无法计算。代码将在一个单独的名为SetNodeEndDate(...)的方法中被恢复。

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();
   }
}

日期计算的几条要求:

  • 在活动加载以后;
  • 在日期或持续时间被修改后(通过数据编辑器对话框或就地编辑器);
  • 活动值通过鼠标交互后再被API修改,因为在这种情况下计算不需要启动,所以内部计算将自动进行。

一个包括所有节点的计算循环可以被VcGantt对象的NodeCollection属性设置。它的代码将被添加到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);
}

由用户引起的数据改变可以由VcNodeModified事件获取。被添加的调用方法将计算结束日期。

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);
}

如果数据的值被API修改,SetNodeEndDate(...)方法将显示调用。

XGantt甘特图开发教程:如何计算结束日期


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:慧都控件网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP