2010-09-27 5 views
1

J'essaie d'utiliser Interop.MSProject avec C# pour faire quelque chose qui, conceptuellement, devrait être la chose la plus simple au monde à faire. Cependant, j'ai quelques problèmes avec son api cryptique qui a une documentation minimale. Tout ce que je souhaite faire est de trouver une ligne qui contient une chaîne spécifique dans une de ses colonnes (cellule) et supprimer cette ligne. Après que j'ai fait cela, je veux juste afficher le fichier de projet modifié afin que l'utilisateur ait la possibilité de l'enregistrer. Voici ce que j'ai essayé:Comment supprimer une tâche (ligne) avec 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; 

Il semble que task.Delete ne fonctionne pas. J'ai même essayé de généraliser ce code à ce qui suit:

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

et cela n'a pas fonctionné non plus. Est-ce que quelqu'un sait d'une manière que je peux supprimer une tâche ou une base de ligne sur une valeur dans l'une des cellules des lignes?

Répondre

1

J'ai affronté la même énigme hier.

Votre approche est correcte mais elle ne fonctionne pas car les tâches sont basées sur des index. Ceci est plus évident dans une boucle droite.

Si vous avez 10 tâches et en supprimez une, disons le numéro 5, maintenant la tâche suivante (6) est maintenant 5 mais votre boucle va essayer de supprimer 6 qui est maintenant 7. Cela gâchera tout.

Si vous voulez supprimer toutes les tâches que vous devez faire quelque chose comme:

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

Après ce train de la pensée, nous allons l'appliquer à une boucle foreach

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

Pourquoi suis-je utiliser GetTaskIndexByGuid? Il semble que la propriété Index de chaque tâche si pas correctement (ou immeadiately) mis à jour lorsque vous supprimez une tâche, mais j'ai trouvé que l'utilisation de GetTaskIndexByGuid renvoie toujours l'index correct.

Espérons que cela aide

Questions connexes