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

通过C#(Microsoft.Office.Interop.MSProject)更改MS Project中特定taskID的值,c#,interop,ms-project,C#,Interop,Ms Project,我正在尝试编辑MS Project中的任务。我想用dateTimePicker中的一个日期更新“StartDate”列中的特定任务(多个任务)。我正在使用Microsoft.Office.Interop.MSProject,但我似乎找不到正确的方法,ActiveProject.Tasks.Add()方法不会更新任务,它只是在指定的taskID处添加另一个任务。我也尝试过替换方法。。。以下是我尝试过的: public static void editTask(string task

我正在尝试编辑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));
                        }
                    }
        }
publicstaticvoidedittask(字符串taskName、DateTime startDate、int taskID)
{
ApplicationClass msProj=新的ApplicationClass();
msProj.Visible=true;
Task addTask=msProj.ActiveProject.Tasks.Add(任务名,任务ID);
addTask.Start=startDate;
}
私有void按钮5\u单击(对象发送者,事件参数)//写入到选择名称的日期。
{

对于(int x=0;x对于编辑任务,您可以在任务中有一个循环,并在需要时进行更改。但请确保格式。例如,task.name是string,大多数是object,因此您必须转换它们。使用这种方式:

            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);

问题就是这样解决的:

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++;
                }
            }
        }
    }
private void按钮5\u单击(对象发送者,事件参数)//写入到选择名称的日期。
{
ApplicationClass msProj=新的ApplicationClass();
int i=0;
foreach(msProj.ActiveProject.Tasks中的任务t)
{
如果(i
如果您的任务版本相当大,那么在程序开始时创建一个类似于:
tasksDictionary
的字典是值得的,然后在每个版本中,只需调用如下内容:
project.tasks[tasksDictionary[id].field=newValue