使用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之后,我得到的

我正在尝试使用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之后,我得到的输出是

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级别。