使用VB.net导出到MS Project时无法创建正确的任务层次结构
我正在尝试使用vb.net将网格数据导出到ms project。我将这些数据放在网格中使用VB.net导出到MS Project时无法创建正确的任务层次结构,vb.net,ms-project,Vb.net,Ms Project,我正在尝试使用vb.net将网格数据导出到ms project。我将这些数据放在网格中 ID Task 1 Task1 1.1 Task2 1.1.1 Task2.1 1.1.1.2 Task2.2 1.2 Task3 1.2.1 Task3.1 但在将其导出到MS Project之后,我得到的
ID Task
1 Task1
1.1 Task2
1.1.1 Task2.1
1.1.1.2 Task2.2
1.2 Task3
1.2.1 Task3.1
但在将其导出到MS Project之后,我得到的输出是
Task Name OutlineLevel OutlineNumber
Task1 1 1
Task2 2 1.1
Task3 2 1.2
Task2.2 3 1.2.1
Task2.3 3 1.2.2
Task3.1 3 1.2.3
虽然任务按顺序添加,但生成的大纲编号不正确。而且它还在中间添加了一个空行。
我使用了以下代码
Private Sub ubtnExport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ubtnExport.Click
Try
Dim ProjectApp As New Microsoft.Office.Interop.MSProject.ApplicationClass()
ProjectApp.AppMaximize()
ProjectApp.FileNew(Type.Missing, Type.Missing, Type.Missing, Type.Missing)
Dim Project As Microsoft.Office.Interop.MSProject.Project = ProjectApp.ActiveProject
Dim Task As Microsoft.Office.Interop.MSProject.Task
dtTempWBSDetail = CType(Grid.DataSource, DataTable)
For Each dtRow As DataRow In dtTempWBSDetail.Select("Hlevel=1")
Task = Project.Tasks.Add(dtRow("Particular"), dtRow("UniqueNo"))
Task.OutlineLevel = dtRow("HLevel")
Task.Text1 = dtRow("Id")
If Val(Convert.ToString(dtRow("% Complete"))) <> 0 Then
Task.PercentComplete = dtRow("% Complete")
End If
CreateSubTask(dtRow("WBSNo"), dtRow("WBSTaskNo"), dtRow("HLevel"), Task, Project)
Next
Project = Nothing
ProjectApp = Nothing
Catch ex As Exception
Throw ex
End Try
End Sub
Sub CreateSubTask(ByVal WBSNo As Integer, ByVal WBSTaskNo As Integer, ByVal HLevel As Short, ByVal Task As Microsoft.Office.Interop.MSProject.Task, ByVal Project As Microsoft.Office.Interop.MSProject.Project)
For Each dtRow As DataRow In dtTempWBSDetail.Select("IsNull(WBSParentTaskNo,0) =" & WBSTaskNo.ToString & " and IsNull(WBSParentNo,0)=" & WBSNo)
Dim ChildTask As Microsoft.Office.Interop.MSProject.Task = Task.OutlineChildren.Add(dtRow("Particular"), dtRow("UniqueNo"))
ChildTask.OutlineLevel = dtRow("HLevel")
ChildTask.Text1 = dtRow("Id")
If Val(Convert.ToString(dtRow("% Complete"))) <> 0 Then
ChildTask.PercentComplete = dtRow("% Complete")
End If
CreateSubTask(dtRow("WBSNo"), dtRow("WBSTaskNo"), dtRow("HLevel"), ChildTask, Project)
Next
End Sub
Private Sub ubtnExport\u Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理ubtnExport。单击
尝试
Dim ProjectApp作为新的Microsoft.Office.Interop.MSProject.ApplicationClass()发布
ProjectApp.AppMaximize()
ProjectApp.FileNew(Type.Missing,Type.Missing,Type.Missing,Type.Missing)
将项目设置为Microsoft.Office.Interop.MSProject.Project=ProjectApp.ActiveProject
将任务设置为Microsoft.Office.Interop.MSProject.Task
dtTempWBSDetail=CType(Grid.DataSource,DataTable)
对于DTTEMPWBSDEAIL.Select中作为数据行的每个dtRow(“Hlevel=1”)
Task=Project.Tasks.Add(dtRow(“特定”)、dtRow(“UniqueNo”))
Task.OutlineLevel=dtRow(“HLevel”)
Task.Text1=dtRow(“Id”)
如果Val(Convert.ToString(dtRow(“%Complete”))为0,则
Task.PercentComplete=dtRow(“%Complete”)
如果结束
创建子任务(dtRow(“WBSNo”)、dtRow(“WBSTaskNo”)、dtRow(“HLevel”)、任务、项目)
下一个
项目=无
ProjectApp=无
特例
投手
结束尝试
端接头
子CreateSubTask(ByVal WBSNo为整数,ByVal WBSTaskNo为整数,ByVal HLevel为短,ByVal任务为Microsoft.Office.Interop.MSProject.Task,ByVal项目为Microsoft.Office.Interop.MSProject.Project)
将每个数据行作为dtTempWBSDetail中的数据行。选择(“IsNull(WBSParentTaskNo,0)=”&WBSTaskNo.ToString&”和IsNull(WBSParentNo,0)=”&WBSNo)
Dim ChildTask为Microsoft.Office.Interop.MSProject.Task=Task.OutlineChildren.Add(dtRow(“特定”)、dtRow(“UniqueNo”))
ChildTask.OutlineLevel=dtRow(“HLevel”)
ChildTask.Text1=dtRow(“Id”)
如果Val(Convert.ToString(dtRow(“%Complete”))为0,则
ChildTask.PercentComplete=dtRow(“%Complete”)
如果结束
创建子任务(dtRow(“WBSNo”)、dtRow(“WBSTaskNo”)、dtRow(“HLevel”)、子任务、项目)
下一个
端接头
首先,Task.add()方法中出现问题。
第一个参数是任务名和
第二个参数是任务在其包含集合中的位置。
我提供的第二个参数是错误的,只生成它的空白行。
其次,仅创建任务的大纲结构task.OutlineLevel是不够的,因为它在层次结构中指定了任务的级别。Task.outlineNumber精确指定任务在层次结构中的位置,但它是只读属性。
所以我使用了Task.OutlineIndent()和Task.OutlineOutdent()方法
我用了密码
Dim iTaskIndex作为整数
将前一级变暗为短
Private Sub ubtnExport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ubtnExport.Click
Try
Dim ProjectApp As New Microsoft.Office.Interop.MSProject.ApplicationClass()
ProjectApp.AppMaximize()
ProjectApp.FileNew(Type.Missing, Type.Missing, Type.Missing, Type.Missing)
Dim Project As Microsoft.Office.Interop.MSProject.Project = ProjectApp.ActiveProject
Dim Task As Microsoft.Office.Interop.MSProject.Task
dtTempWBSDetail = CType(ugdTaskDetails.DataSource, DataTable)
iTaskIndex = 1
PrevOutlineLevel = 1
For Each dtRow As DataRow In ugdTaskDetails.Rows
If Convert.ToString(dtRow("Id")) <> "" Then
AddTaskToProject(Project, dtRow)
iTaskIndex = iTaskIndex + 1
End If
Next
Project = Nothing
ProjectApp = Nothing
Catch ex As Exception
Throw ex
End Try
End Sub
Sub AddTaskToProject(ByVal Project As Microsoft.Office.Interop.MSProject.Project, ByVal dtRow As Datarow)
Dim Task As Microsoft.Office.Interop.MSProject.Task
Task = Project.Tasks.Add(dtRow("Particular"), iTaskIndex)
If Val(Convert.ToString(dtRow("HLevel"))) - PrevOutlineLevel > 0 Then
Task.OutlineIndent()
Else
For Ol As Short = 1 To PrevOutlineLevel - Val(Convert.ToString(dtRow("HLevel")))
Task.OutlineOutdent()
Next
End If
Task.Text1 = dtRow("Id")
If Val(Convert.ToString(dtRow("% Complete"))) <> 0 Then
Task.PercentComplete = dtRow("% Complete")
End If
PrevOutlineLevel = dtRow("HLevel")
End Sub
Private Sub ubtnExport\u Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理ubtnExport。单击
尝试
Dim ProjectApp作为新的Microsoft.Office.Interop.MSProject.ApplicationClass()发布
ProjectApp.AppMaximize()
ProjectApp.FileNew(Type.Missing,Type.Missing,Type.Missing,Type.Missing)
将项目设置为Microsoft.Office.Interop.MSProject.Project=ProjectApp.ActiveProject
将任务设置为Microsoft.Office.Interop.MSProject.Task
dtTempWBSDetail=CType(ugdTaskDetails.DataSource,DataTable)
iTaskIndex=1
PrevOutlineLevel=1
对于ugdTaskDetails.Rows中作为DataRow的每个dtRow
如果Convert.ToString(dtRow(“Id”))“”则
AddTaskToProject(项目,dtRow)
iTaskIndex=iTaskIndex+1
如果结束
下一个
项目=无
ProjectApp=无
特例
投手
结束尝试
端接头
子AddTaskToProject(ByVal项目作为Microsoft.Office.Interop.MSProject.Project,ByVal dtRow作为Datarow)
将任务设置为Microsoft.Office.Interop.MSProject.Task
Task=Project.Tasks.Add(dtRow(“特定”),iTaskIndex)
如果Val(Convert.ToString(dtRow(“HLevel”))-PrevOutlineLevel>0,则
Task.OutlineIndent()文件
其他的
对于Ol As Short=1到PrevOutlineLevel-Val(Convert.ToString(dtRow(“HLevel”))
Task.OutlineOutdent()的大纲
下一个
如果结束
Task.Text1=dtRow(“Id”)
如果Val(Convert.ToString(dtRow(“%Complete”))为0,则
Task.PercentComplete=dtRow(“%Complete”)
如果结束
PrevOutlineLevel=dtRow(“HLevel”)
端接头
向我们显示用于导出数据的代码。否则你怎么想象我们知道你做错了什么?我已经添加了代码。请确实建议这段代码有什么问题。您应该使CreateSubTask
递归并查询与递归深度对应的HLE级别。