VB.NET操作MS Project 2019如何更新甘特图的任务排序显示
核心问题原因
你当前仅修改了自定义WBSProject类的内存任务序列,未同步修改MS Project COM对象的任务顺序,甘特图视图读取的是MS Project自身的任务集合排序规则,所以不会自动同步。
解决方案代码
替换你现有WBSTaskRearangement方法的实现即可:
''' <summary> ''' 重新排列MS Project中的任务顺序并同步刷新甘特图 ''' </summary> ''' <param name="ProjectApp"> MSProject应用实例</param> ''' <param name="project"> 自定义WBS项目对象</param> ''' <param name="Sequence"> 新的任务排序序列</param> Public Sub WBSTaskRearangement(ByRef ProjectApp As MSProject.Application, ByRef project As WBSProject, Sequence As List(Of WBSTask)) ' 先更新自定义对象的任务列表 project.SetProjectTaskList(Sequence) ' 关闭屏幕更新提升性能,避免界面闪烁 Dim originalScreenUpdating As Boolean = ProjectApp.ScreenUpdating Dim originalAlertState As Boolean = ProjectApp.DisplayAlerts ProjectApp.ScreenUpdating = False ProjectApp.DisplayAlerts = False Try Dim activeProj As MSProject.Project = ProjectApp.ActiveProject ' 按新的序列依次调整任务位置 For targetIndex As Integer = 1 To Sequence.Count Dim wbsTask = Sequence(targetIndex - 1) ' 推荐用UniqueID匹配任务,避免重名匹配错误,可根据你WBSTask的实际存储字段调整 Dim msTask As MSProject.Task = activeProj.Tasks.UniqueID(wbsTask.MSUniqueID) ' 如果没有存UniqueID可以临时用名称匹配,注意规避重名问题 ' Dim msTask As MSProject.Task = activeProj.Tasks.Cast(Of MSProject.Task).FirstOrDefault(Function(t) t.Name = wbsTask.name) If msTask IsNot Nothing Then ' 将任务移动到目标行位置(MS Project行号从1开始) msTask.Move(to:=targetIndex) End If Next ' 重新计算项目数据 ProjectApp.CalculateProject() ' 强制刷新甘特图视图 ProjectApp.ViewApplyEx(ApplyTo:=0, BuiltInView:=MSProject.PjViewType.pjViewGantt) Catch ex As Exception ' 可根据业务需要补充异常处理逻辑 Throw ex Finally ' 恢复原有设置 ProjectApp.ScreenUpdating = originalScreenUpdating ProjectApp.DisplayAlerts = originalAlertState End Try End Sub
注意事项
- 如果任务存在大纲层级(父子任务结构),移动父任务时会自动携带所有子任务,无需单独调整子任务位置
- 操作跨子项目的任务时,需要先激活对应子项目再执行移动逻辑
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

