通过C#更改MS Project中特定任务ID的值(Microsoft.Office.Interop.MSProject)

时间:2013-04-23 19:58:41

标签: c# interop ms-project

我正在尝试编辑MS Project中的任务。我想使用dateTimePicker中的单个日期更新“StartDate”列中的特定任务(多个任务)。我正在使用Microsoft.Office.Interop.MSProject但我似乎无法找到正确的方法,ActiveProject.Tasks.Add()方法不更新任务,它只是在指定的taskID处添加了另一个任务。我也尝试过替换方法......这是我试过的:

        public static void editTask(string taskName, DateTime startDate, int taskID)
        {
            ApplicationClass msProj = new ApplicationClass();
            msProj.Visible = true;
            Task addTask = msProj.ActiveProject.Tasks.Add(taskName,taskID);
            addTask.Start = startDate;
        }

        private void button5_Click(object sender, EventArgs e) //Writes to date where names are selected.
        {
                    for (int x = 0; x <= checkedListBox1.CheckedItems.Count - 1; x++)
                    {
                        foreach (var item in checkedListBox1.SelectedItems)
                        {
                            msProj.Replace(Name,Type.Missing,checkedListBox1.SelectedItem,dateTimePicker1.Text,true,true,false,PjField.pjResourceName,PjComparison.pjCompareEquals);
                            //editTask(checkedListBox1.CheckedItems[x].ToString(), DateTime.Parse(dateTimePicker1.Text));
                        }
                    }
        }

我正在使用VS 2010和Office Project 2010

如果您需要更多关于我想做什么或做什么的信息,请问我。请原谅我上面的代码,它已被编辑和更改,这些Interop的东西让我的大脑皱了皱......

我在Office.Interop上找不到太多关于MSProject的信息。请接受任何链接或帮助。

此致

4 个答案:

答案 0 :(得分:1)

这就是问题的解决方法:

private void button5_Click(object sender, EventArgs e) //Writes to date where names are selected.
    {
        ApplicationClass msProj = new ApplicationClass();
        int i = 0;
        foreach (Task t in msProj.ActiveProject.Tasks)
        {
            if (i < checkedListBox1.CheckedItems.Count)
            {
                if (t.ID == int.Parse(checkedListBox1.CheckedItems[i].ToString()))
                {
                    t.Start = DateTime.Parse(dateTimePicker1.Text);
                    i++;
                }
            }
        }
    }

答案 1 :(得分:1)

您可以使用:

Task yourTask = project.Tasks.get_UniqueID(UniqueId)

它将返回任务的对象,该对象具有给定的 UniqueId。所以它是一种寻找具有特定 UniqueId 的任务的方法。 UniqueId 类型的 int。现在您可以更改任务中的数据。

yourTask.Start = DateTime.Parse(dateTimePicker1.Text)

答案 2 :(得分:0)

对于编辑任务,您可以在任务中进行循环并随时更改。但请确保格式。例如,task.name是字符串,大多数是对象,因此您必须转换它们。用这种方式:

            ApplicationClass projectApp = new ApplicationClass();                
            projectApp.FileOpen("C:\\test.mpp", false, Missing.Value, Missing.Value,  Missing.Value,Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,PjPoolOpen.pjPoolReadWrite, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

            // Get the active project
            Project proj = projectApp.ActiveProject;
            foreach (Task task in proj.Tasks)
                {
                                try
                                {
                                    Object per = "25";//any data you want to change
                                    task.PhysicalPercentComplete = per;
                                }
                                catch
                                {

                                }
                }//foreach

最后你应该关闭并保存它们:

            projectApp.FileSaveAs("c:\\sample.mpp", PjFileFormat.pjMPP, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            projectApp.FileCloseAll(PjSaveType.pjSave);

答案 3 :(得分:0)

如果您的任务版本相当大,则值得在程序开始时创建一个像这样的字典:tasksDictionary<id, counter>,然后在每个版本中,只需调用这样的内容:{{1} }。