2010-09-27 31 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總是返回正確的索引。

希望它有幫助