们知道,SharePoint
工作流
通过任务
驱动
,在真实场景中,
们可能
希望工作流的任务处理方式能够更加灵活,比如批量处理、通过Office Communicator等IM软
处理任务等等,这时候我们就需
以编程
方式在外部完成任务。
按照正常想法,SharePoint
任务列表也是
个SPList,所以我们
这样尝试:
SPSite site = new SPSite("http://windstyle");
SPWeb web = site.OpenWeb();
web.AllowUnsafeUpdates = true;
SPList taskList = web.Lists["任务"];
SPListItem task = taskList.Items[0];
task["状态"] = "已完成";
task["Completed"] = true;
task.Update();
web.AllowUnsafeUpdates = false;
执行之后,发现任务确实已经被设置已完成状态,但工作流却没有继续执行,也就是说,工作流
OnTaskChanged活动并没有捕捉到任务被更改
事
。
其实SharePoint对象模型提供了更改工作流任务属性方法,即SPWorkflowTask.AlterTask,此方法不仅能够更改工作流任务
属性,还
这
更改通知相应
工作流,使得相应
工作流能够继续执行。
SPSite site = new SPSite(http://henry/);
SPWeb web = site.OpenWeb();
SPList doclib = web.Lists["合同管理"];
SPListItem doc = doclib.Items[0];
SPWorkflowTaskCollection tasks = doc.Workflows[doc.Workflows.Count-1].Tasks; //找具体
SPWorkflowTask
Hashtable ht = new Hashtable();
ht.Add(SPBuiltInFieldId.Completed, true); //任务设置
完成状态
ht.Add(SPBuiltInFieldId.TaskStatus, "已完成");//任务
任务列表
显示状态设置
“已完成”
ht.Add(SPBuiltInFieldId.PercentComplete, 1); //任务
任务列表
完成百分比设置
“100%”
ht.Add(SPBuiltInFieldId.WorkflowOutcome, "Some output infomation"); //设置任务输出消息,等同于使
Visual Studio设计工作流时,CompleteWorkflow活动
TaskOutput属性
SPWorkflowTask.AlterTask(tasks[0], ht, true);
从上段代码可以看出,以编程方式来完成任务并不困难,其中比较麻烦的是如何找到正确
工作流任务。因
SPListItem.Workflows可能包含不止
个SPWorkflow,这些 SPWorkflow可能源于同
个SPWorkflowTemplate,也可能源于不同
SPWorkflowTemplate。而且还可能包含源于同
个SPWorkflowTemplate
个SPWorkflow,当然,
们知道,同
个工作流模板
同
个SPListItem上只能启动一个工作流实例,所以这些SPWorkflow中只有一个的IsCompleted属性为true。