【问题标题】:Changing a value at a specific taskID within MS Project through C#(Microsoft.Office.Interop.MSProject)通过 C#(Microsoft.Office.Interop.MSProject) 在 MS Project 中更改特定 taskID 的值
【发布时间】:2013-04-23 19:58:40
【问题描述】:

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

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

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

问候,

【问题讨论】:

    标签: c# interop ms-project


    【解决方案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++;
                    }
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      你可以使用:

      Task yourTask = project.Tasks.get_UniqueID(UniqueId)
      

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

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

      【讨论】:

        【解决方案3】:

        对于编辑任务,您可以在任务中循环并随时更改。但请确保格式。举个例子,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);
        

        【讨论】:

          【解决方案4】:

          如果您的任务版本非常大,则值得在程序开始时创建一个类似:tasksDictionary&lt;id, counter&gt; 的字典,然后在每个版本中,只需调用类似这样的内容:project.Tasks[tasksDictionary[id]].field = newValue

          【讨论】:

            猜你喜欢
            • 2012-01-16
            • 2018-12-21
            • 1970-01-01
            • 1970-01-01
            • 2016-12-17
            • 1970-01-01
            • 1970-01-01
            • 2015-12-20
            • 2010-09-06
            相关资源
            最近更新 更多