1

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

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

这也不起作用。有谁知道我可以根据其中一个行单元格中的值删除任务或行的方法?

4

1 回答 1

1

我昨天遇到了同样的难题。

您的方法是正确的,但它不起作用,因为任务是基于索引的。这在直接 for 循环中更为明显。

如果您有 10 个任务并删除了一个,比如说第 5 个,现在下一个任务 (6) 现在是 5,但是您的循环将尝试删除 6,现在是 7。这会搞砸一切。

如果要删除所有任务,您应该执行以下操作:

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

遵循这一思路,让我们将其应用于 foreach 循环

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

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

希望能帮助到你

于 2010-12-14T11:44:30.573 回答