拆分(暂停)任务

有的时候,一个任务在执行过程中,可能因为设备、人力或前置任务的原因,不得不暂时中断(停工),等相关条件满足后再继续执行。

为满足这种需求,我们给Task(任务)增加了拆分功能,可以将一个任务拆分成多段。

拆分任务

要拆分一个任务,可以单击工具栏中的"拆分任务"按钮,将鼠标移到需要拆分的位置,然后按下鼠标即可,下面是一个动画演示:

合并任务

要合并任务很简单,只需将拆分后的各段重新拖动到一块即可,下面是一个动画演示:

用代码拆分任务

你也可以用代码拆分某个任务,参考代码如下:

Dim gv As GanttView = e.Form.Controls("GanttView1").GanttView
Dim
idx As Integer = gv.Tasks.IndexOf("Task3")
Dim
tk As Gantt.Task = gv.Tasks(idx)
Dim
start As Date = tk.Start.Value '获得任务的开始日期
tk.SplitTask(start.AddDays(3), 2)
'在任务开始3天后停工两天
tk.SplitTask(
New Date(2024, 9, 21), 1) '921日停工一天

执行结果:

你还可以用下面的代码完成任务拆分,这种方式更灵活:

Dim gv As GanttView = e.Form.Controls("GanttView1").GanttView
Dim
tk as Gantt.Task = gv.Tasks.Search("Task3")
tk.SplitTask({2, 2, 3, 1, 3})
·

上面的代码中,SplitTask的参数是一个数组,“
2, 2, 3, 1, 3”表示先执行2天,接着暂停2天,然后继续执行3天,接着又暂停一天,最后执行3天。

获得拆分结果

Task有一个Parts属性,用于返回拆分结果,这是一个数组,元素顺序为: 持续时间1-中断时间1-持续时间2-中断数据2......

以上面的拆分结果为例,若执行下面的代码:

Dim gv As GanttView = e.Form.Controls("GanttView1").GanttView
Dim
idx As Integer = gv.Tasks.IndexOf("Task3")
Dim
tk As Gantt.Task = gv.Tasks(idx)
If
tk.Parts IsNot Nothing Then '如果任务被拆分了
    MessageBox.Show(
String.Join(",", tk.Parts))
End
If

显示的结果为“2,2,3,1,3”,表示执行2天,暂停2天,继续执行3天,然后又暂停一天,最后执行3天,注意这里的天数是用工作日计算的。

如果你要获得每一段的起始时间和结束时间,可以将代码改为:

Dim gv As GanttView = e.Form.Controls("GanttView1").GanttView
Dim
idx As Integer = gv.Tasks.IndexOf("Task3")
Dim
tk As Gantt.Task = gv.Tasks(idx)
If tk.Parts IsNot Nothing Then '如果任务被拆分了
    MessageBox.Show(
String.Join(vbcrlf, tk.Parts.PartDates))
End
If

显示的结果为:

2024-09-12
2024-09-14
2024-09-18
2024-09-21
2024-09-24
2024-09-27

表示任务从9月12日开始,从9月14日开始停工,到9月18日复工,然后到9月21日又开始停工,到9月24日复工,到9月27日完工。

用代码合并任务

Task并没用直接提供提供一个合并任务的方法, 如果你一定要通过代码来撤销某个任务的拆分,可以参考下面的代码:

Dim gv As GanttView = e.Form.Controls("GanttView1").GanttView
Dim
idx As Integer = gv.Tasks.IndexOf("Task3")
Dim
tk As Gantt.Task = gv.Tasks(idx)
For
i As Integer = tk.Parts.Count - 2 To 1 Step - 2
    tk.Parts(i) = 0

Next

代码原理并不复杂,就是将Parts数组中表示中断天数的元素的值设置为0。


本页地址:http://www.foxtable.com/webhelp/topics/3998.htm