0

我正在尝试在 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

如果您需要有关如何或我想做什么的更多信息,请问我。请原谅我上面的代码,它被编辑和改变了很多,这些互操作的东西让我的大脑皱了起来......

我在 MSProject 的 Office.Interop 上找不到太多信息。请,任何链接或帮助将不胜感激。

问候,

4

4 回答 4

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++;
                }
            }
        }
    }
于 2013-04-30T10:26:21.480 回答
1

您可以使用:

Task yourTask = project.Tasks.get_UniqueID(UniqueId)

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

yourTask.Start = DateTime.Parse(dateTimePicker1.Text)
于 2021-07-02T08:35:46.943 回答
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);
于 2013-04-30T10:25:19.713 回答
0

如果您的任务版本非常大,则值得创建一个字典,例如:tasksDictionary<id, counter>在程序的开头,然后在每个版本中,只需调用如下内容:project.Tasks[tasksDictionary[id]].field = newValue.

于 2020-05-23T05:34:36.663 回答