2010-09-27 29 views
1

我正尝试在C#中使用Interop.MSProject来做一些概念上的事情,应该是世界上最简单的事情。然而,我对这个含有极少文档的神秘api有些麻烦。我想要做的就是找到一行,在其中一列(单元格)中包含特定的字符串,并删除该行。完成之后,我只想显示修改的项目文件,以便用户可以选择保存它。以下是我已经试过:如何使用Interop.MSProject删除任务(行)

MSProject.Application app = new MSProject.Application(); 
app.FileOpenEx(
    filePath, 
    false, 
    Type.Missing, 
    Type.Missing, 
    Type.Missing, 
    Type.Missing, 
    Type.Missing, 
    Type.Missing, 
    Type.Missing, 
    Type.Missing, 
    Type.Missing, 
    MSProject.PjPoolOpen.pjPoolReadWrite, 
    Type.Missing, 
    Type.Missing, 
    Type.Missing, 
    Type.Missing, 
    Type.Missing); 

foreach(MSProject.Task task in proj.Tasks) 
{ 
    if (task == null) continue; 
    string cellValue = task.OutlineCode3; 
    if (cellValue == searchString) 
     task.Delete(); 
} 

app.Visible = true; 

它好像task.Delete不工作。我甚至试图将此代码概括为以下内容:

foreach (MSProject.Task task in proj.Tasks) 
    task.Delete() 

而且这也没有工作。有没有人知道一种方式,我可以删除一个任务或行的基础上的行单元格中的值?

回答

1

昨天我面临同样的难题。

你的方法是正确的,但它不工作,因为任务是基于索引的。这在直线循环中更明显。

如果您有10个任务并删除了一个,让我们说5号,现在下一个任务(6)现在是5,但是您的循环将尝试删除现在为7的6个。这会混淆一切。

如果你想删除你应该这样做的所有任务:

// Task Indexes are 1-based not 0-based 
for(int i = 1; i <= proj.Tasks.Count; i++) { 
    proj.Tasks[i].Delete(); 
    i--; 
} 

按照这个思路,让我们这个适用于我为什么要使用GetTaskIndexByGuid foreach循环

foreach(Task t in tasksToDelete) { 
    proj.Tasks[proj.GetTaskIndexByGuid(t.Guid)].Delete(); 
} 

?似乎每个任务的索引属性如果在删除任务时没有正确(或立即)更新,但我发现使用GetTaskIndexByGuid总是返回正确的索引。

希望它有帮助