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

问题描述 投票:0回答:3

我正试图在MS Project中编辑一个任务,我想在 "StartDate "列中用一个日期更新特定的任务(多个任务)。我想在 "StartDate "列更新特定的任务(多个任务),用dateTimePicker中的一个日期。我正在使用Microsoft.Office.Interop.MSProject,但我似乎找不到正确的方法,我的方法是:在 "StartDate "栏中添加一个日期。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 for MSProject的信息。请,任何链接或帮助将被感激。

尊敬的各位。

c# interop ms-project
3个回答
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++;
                }
            }
        }
    }

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

0
投票

如果你的任务的版本非常多,那就应该在程序开始时创建一个字典,比如:tasksDictionary<id, counter> 在你的程序开始的时候, 然后在每个版本中, 简单地调用这样的东西:project.Tasks[tasksDictionary[id]].field = newValue.

© www.soinside.com 2019 - 2024. All rights reserved.