Как удалить задачу (строку) с Interop.MSProject - PullRequest
1 голос
/ 27 сентября 2010

Я пытаюсь использовать Interop.MSProject с C #, чтобы сделать что-то концептуальное, должно быть самой простой вещью в мире. Тем не менее, у меня возникли некоторые проблемы с его загадочным 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;

Кажется, будто задача. Удаление не работает. Я даже пытался обобщить этот код следующим образом:

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

и это тоже не сработало. Кто-нибудь знает, как я могу удалить задачу или строку строки на основе значения в одной из ячеек строк?

1 Ответ

1 голос
/ 14 декабря 2010

Вчера я столкнулся с той же загадкой.

Ваш подход правильный, но он не работает, потому что задачи основаны на индексах.Это более очевидно в прямом цикле.

Если у вас есть 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 всегда возвращает правильный индекс.

...