使用VSTO开发Microsoft Project插件时添加摘要任务遇COM异常
解决Microsoft Project VSTO插件中添加摘要任务子任务的COM异常问题
错误原因
OutlineChildren.Add()方法的设计目的是创建新任务并直接将其作为当前摘要任务的子任务,而非将已存在于项目任务集合中的任务添加为子任务。你先通过project.Tasks.Add()创建了regionNameSummaryTask,再尝试用OutlineChildren.Add()把这个已存在的任务加入父任务的子任务列表,这就触发了"The argument value is not valid."的COM异常。
另外你的代码还有两个小问题:
- 集合初始化时用了
new Phases(),但定义的是List<Phase>,应该改为new Phase() phases集合初始化语句末尾缺少分号
解决方案
方案一:直接通过父任务的OutlineChildren创建子任务(推荐)
这种方式不需要手动设置大纲层级,创建的任务会自动成为父任务的子任务,大纲层级也会自动继承父层级+1:
private void button1_Click(object sender, RibbonControlEventArgs e) { Project project = Globals.ThisAddIn.Application.ActiveProject; // 创建国家级摘要任务 string countryName = "US"; Task countryNameSummaryTask = project.Tasks.Add(countryName); countryNameSummaryTask.OutlineLevel = 1; // 直接通过父任务的OutlineChildren创建地区级摘要任务 string regionName = "TN"; Task regionNameSummaryTask = countryNameSummaryTask.OutlineChildren.Add(regionName); // 添加阶段任务列表 var phases = new List<Phase>() { new Phase() { Name = "P11", Start = DateTime.Now, Finish = DateTime.Now.AddDays(2) }, new Phase() { Name = "P22", Start = DateTime.Now, Finish = DateTime.Now.AddDays(2) }, new Phase() { Name = "P33", Start = DateTime.Now, Finish = DateTime.Now.AddDays(2) }, new Phase() { Name = "P44", Start = DateTime.Now, Finish = DateTime.Now.AddDays(2) }, }; foreach (var phase in phases) { // 直接通过地区任务的OutlineChildren创建阶段任务 Task newPhaseTask = regionNameSummaryTask.OutlineChildren.Add(phase.Name); newPhaseTask.Start = phase.Start; newPhaseTask.Finish = phase.Finish; } }
方案二:通过设置Parent属性建立父子关系
如果需要先创建所有任务再关联父子关系,可以使用任务的Parent属性来指定父任务:
private void button1_Click(object sender, RibbonControlEventArgs e) { Project project = Globals.ThisAddIn.Application.ActiveProject; // 创建国家级摘要任务 string countryName = "US"; Task countryNameSummaryTask = project.Tasks.Add(countryName); countryNameSummaryTask.OutlineLevel = 1; // 创建地区级摘要任务 string regionName = "TN"; Task regionNameSummaryTask = project.Tasks.Add(regionName); regionNameSummaryTask.OutlineLevel = 2; // 通过Parent属性关联父任务 regionNameSummaryTask.Parent = countryNameSummaryTask; // 添加阶段任务列表 var phases = new List<Phase>() { new Phase() { Name = "P11", Start = DateTime.Now, Finish = DateTime.Now.AddDays(2) }, new Phase() { Name = "P22", Start = DateTime.Now, Finish = DateTime.Now.AddDays(2) }, new Phase() { Name = "P33", Start = DateTime.Now, Finish = DateTime.Now.AddDays(2) }, new Phase() { Name = "P44", Start = DateTime.Now, Finish = DateTime.Now.AddDays(2) }, }; foreach (var phase in phases) { Task newPhaseTask = project.Tasks.Add(phase.Name); newPhaseTask.OutlineLevel = 3; // 通过Parent属性关联地区任务作为父任务 newPhaseTask.Parent = regionNameSummaryTask; } }
内容的提问来源于stack exchange,提问作者sridharnetha
相关产品推荐
相关产品推荐

