SharePoint工作流开发点滴(7) - 用代码完成任务
2012-12-06 11:52
246 查看
SharePoint的工作流是通过任务来驱动的,在真实场景中,我们可能会希望工作流的任务 处理方式能够更加灵活,比如批量处理、通过Office Communicator等IM软件处理任务等等,这时候我们 就需要以编程的方式在外部完成任务。
按照正常的想法,SharePoint的任务列表也是一个SPList,所以我们会这样尝试:
执行之后,发现任务确实已经被设置为已完成状态,但工作流却没有继续执行,也就是说,工作流的 OnTaskChanged活动并没有捕捉到任务被更改的事件。
其实SharePoint对象模型提供了更改工作流任务属性的方法,即SPWorkflowTask.AlterTask,此方法 不仅能够更改工作流任务的属性,还会将这一更改通知相应的工作流,使得相应的工作流能够继续执行。
此方法的用法也很简单:
从上段代码可以看出,以编程的方式来完成任务并不困难,其中比较麻烦的是如何找到正确的工作流 任务。因为SPListItem.Workflows可能包含不止一个SPWorkflow,这些 SPWorkflow可能源于同一个 SPWorkflowTemplate,也可能源于不同的SPWorkflowTemplate。而且还可能包含源于同一个 SPWorkflowTemplate的多个SPWorkflow,当然,我们知道,同一个工作流模板在同一个SPListItem上只能 启动一个工作流实例,所以这些SPWorkflow中只有一个的IsCompleted属性为true。
所以在编写代码来完成工作流任务时,注意获取到正确的工作流任务,然后就可以轻松的完成任务了 。
按照正常的想法,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://windstyle"); 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。
所以在编写代码来完成工作流任务时,注意获取到正确的工作流任务,然后就可以轻松的完成任务了 。
相关文章推荐
- SharePoint工作流开发点滴(7) - 用代码完成任务
- SharePoint 2007工作流开发点滴(7) – 用代码完成任务
- 软件代码生成工具--软工厂V2.0版本免费使用地址+教学视频,快速完成开发任务。
- 安卓简单app开发实践,代码完成后没报错,但功能就是无法使用,学生菜鸟,求指导
- Code maturity level options 代码成熟度选项 [*]Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择 我是开发者,所以选[*] Loadable module support 可加载模块支持 [*]Enable loadable module support 内核编译配置选项简介 (2.4.20-8
- C# 代码分析器 1.0 版开发完成
- 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。
- java游戏开发--简单的几行代码就完成了驱动小精灵的编程
- Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--简介+代码+资源
- 快速完成兼职外包开发任务
- 时间紧、任务重的时候怎么办,怎么解决还未完成的代码?
- 开发小点滴:如何在c#代码里将指定字段绑定到item内的控件
- 快速完成兼职外包开发任务
- 我完成一个开发任务的流程(一)
- SharePoint工作流开发点滴(4) - 工作流中的自定义类与内部错误 (update 2008.12.25)
- 同一套代码部署多个实例来并行完成某项任务,且避免重复执行
- java游戏开发--简单的几行代码就完成了驱动小精灵的编程
- WPF学习开发客户端软件-任务助手(下 2015年2月4日代码更新)
- Html5游戏开发-145行代码完成一个RPG小Demo
- SharePoint工作流开发点滴(3) - 添加外部工具,方便工作流开发