我正试图在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的信息。请,任何链接或帮助将被感激。
尊敬的各位。
问题是这样解决的。
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++;
}
}
}
}
对于编辑任务来说,你可以在任务中进行循环,并在你想要的时候进行修改。但要注意格式。例如,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);
如果你的任务的版本非常多,那就应该在程序开始时创建一个字典,比如:tasksDictionary<id, counter>
在你的程序开始的时候, 然后在每个版本中, 简单地调用这样的东西:project.Tasks[tasksDictionary[id]].field = newValue
.