quickflow最新版本增加了ExecuteCode活动,用Designer设计的流程也可以编写代码逻辑了。
UserContext:指定代码是以启动人的身份还是系统账号身份运行。
MethodCode:要运行的代码, 双击活动即可调出代码编辑窗口
MethodParam:参数,可以在代码中直接通过param访问。
ExecuteCode实现原理:
ExecuteCode采用动态代码编译实现,用户可以指定一个方法的实现代码,QuickFlow会把方法代码最终编译成一个类DynamicClass ,如下:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Workflow.ComponentModel;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Workflow;
using Microsoft.SharePoint.WorkflowActions;
using CodeArt.SharePoint.CamlQuery;
//methodusing
namespace DynamicCodeGenerate
{
public class DynamicClass : QuickFlow.DynamicClassTemplate
{
public DynamicClass(Activity root, SPWorkflowActivationProperties p)
: base(root, p)
{
}
protected override void Execute(string param)
{
//dllref
//using CodeArt.SharePoint.CamlQuery;
//methodcode ;
}
}
}";
用户代码被插入到//methodcode 的位置。
基本方法
DynamicClass的基类已经实现了大量常用的方法,可以直接调用:
基本属性和方法
| SPWeb Web | 获取当前SPWeb |
| SPListItem Item | 获取当前ListItem |
| protected SPList List | 获取当前List |
| void Log(object msg) | 写日志,日志信息会显示到工作流状态页面 |
| object GetVariable(string name) | 获取工作流变量值 |
| void SetVariable(string name, object v) | 设置工作流变量值 |
列表项操作方法
| SPListItem GetItem(string listName, int itemId) | 获取列表项 |
| SPListItemCollection GetItems(string listName, CamlExpression expr) | 查询列表项 |
| void UpdateItem(string fieldNames, params object[] values) | 更新列表项 |
| void UpdateItem(string listName, int itemId, string fieldNames, params object[] values) | |
| UpdateItem(String listName, int itemId, Hashtable properties) | |
| int CreateItem(String listName, Hashtable properties) | 创建列表项 |
| int CreateItem(string listName, string fieldNames, params object[] values) | |
|
void DeleteItem(String listName, int itemId) |
删除列表项 |
|
void DeleteItems(String listName, CamlExpression expr) |
删除符合条件的列表项 |
| void SetModerationStatus(String listName, int itemId, SPModerationStatusType type, string comments) | 设置内容审批状态 |
| void SetModerationStatus(SPModerationStatusType type, string comments) | 设置当前项目的内容审批状态 |
QuickFlow.DynamicClassTemplate 的实现见:
除了以上提供的方法,可以编写任何C#代码
注:
1)建议只在QFD中使用ExecuteCode,如果采用VS+QF,直接处理QuickFlow提供的相关事件(如Completed)或者用Step+CodeActivity更好的实现代码功能。
2)在自定义表单的情况下,代码应该优先写到表单中或业务逻辑层。



