拆分(暂停)任务
有的时候,一个任务在执行过程中,可能因为设备、人力或前置任务的原因,不得不暂时中断(停工),等相关条件满足后再继续执行。
为满足这种需求,我们给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)
'在9月21日停工一天
执行结果:
你还可以用下面的代码完成任务拆分,这种方式更灵活:
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。