quickflow最新版本增加了ExecuteCode活动,用Designer设计的流程也可以编写代码逻辑了。

ExecuteCode活动属性说明:

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;
//methodusingnamespace 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 的实现见:

http://cid-7f5a25cdf47d03e6.office.live.com/self.aspx/QuickFlow/FrameworkCode/DynamicClassTemplate.cs

http://cid-7f5a25cdf47d03e6.office.live.com/self.aspx/QuickFlow/FrameworkCode/DynamicClassTemplate.ListItem.cs

除了以上提供的方法,可以编写任何C#代码

注:

1)建议只在QFD中使用ExecuteCode,如果采用VS+QF,直接处理QuickFlow提供的相关事件(如Completed)或者用Step+CodeActivity更好的实现代码功能。

2)在自定义表单的情况下,代码应该优先写到表单中或业务逻辑层。

3)若需要引用其他dll或名称空间,代码格式如下:

//dllref some.dll

//using xxx.xxx;

...other code

dll需要先部署到GAC

4)引用外部dll示例:

//dllref System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
//dllref System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
//using System.Data;
//using System.Data.SqlClient;

DataTable dt = null;

5) 最新版本考虑到安全性,不允许直接通过 dllref引用外部dll,若需要引用外部程序集, 必须首先配置到web.config的<authorizedTypes>中:

<authorizedTypes>
<authorizedType Assembly="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Namespace="*" TypeName="*" Authorized="True" />

<authorizedType Assembly="System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Namespace="*" TypeName="*" Authorized="True" />

然后在编辑器中:

//dllref System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
//dllref System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
//using System.Data;
//using System.Data.SqlClient;

DataTable dt = null;

dllref始终是需要的,authorizedType的配置用于工作流运行时的安全校验。而dllref是为了设计时校验用的。

示例:

如何通过ExecuteCode获取其他列表数据。

场景:有个配置列表用来配置每步的审批人,配置列表字段如下:

Title: 工作流名称

Level1Approver:第一步审批人

Level2Approver:第二步审批人

操作步骤:

新建工作流,加两个string类型工作流变量:level1Approver,level2Approver

拖一个ExecuteCode活动,拖两个Task活动,task活动的User属性分别绑定到level1Approver,level2Approver。

画线连接Start->ExecuteCode-Task1->Task2.

双击ExecuteCode,写脚本如下:

QueryField titleField = new QueryField("Title");
SPList cfgList = this.Web.Lists["审批人配置"];
var cfgItem = ListQuery.From(cfgList).Where(titleField=="名片申请").GetItems()[0]; //获取到配置项

//获取字段值
SPFieldUserValue user1Value = cfgItem .Fields.GetField("Level1Approver").GetFieldValue(cfgItem["Level1Approver"].ToString()) as SPFieldUserValue;
var level1User = user1Value.User.LoginName;
this.Log("getLevel1Approver:" + level1User);

this.SetVariable("level1Approver", level1User);

//获取字段值
SPFieldUserValue user2Value = cfgItem .Fields.GetField("Level2Approver").GetFieldValue(cfgItem["Level2Approver"].ToString()) as SPFieldUserValue;
var level2User = user2Value.User.LoginName;
this.Log("getLevel2Approver:" + level2User);

this.SetVariable("level2Approver", level2User);

complete post: http://www.cnblogs.com/jianyi0115/archive/2013/05/14/3077140.html

转载于:https://www.cnblogs.com/jianyi0115/archive/2011/04/17/2018872.html

QuickFlow教程(14)—ExecuteCode using QuickFlowDesigner相关推荐

  1. Directx11教程(14) D3D11管线(2)

    Directx11教程(14) D3D11管线(2) 原文:Directx11教程(14) D3D11管线(2) 下面我们来了解一些GPU memory的知识,主要参考资料:http://fgiese ...

  2. STM32 进阶教程 14 - 程序加密之FLASH读写保护

    前言 在嵌入式应用开发中,应用开发完成后往往需要对芯片中的程序进行加密处理,用以保护程序安全(不至被竞争对手从芯片把程序固件考走),本节将给大学介绍一个如何实现程序自动给芯片加密功能.学完本节内容,你 ...

  3. STM32 基础系列教程 14 - IIC

    前言 学习stm32 IIC接口的使用,用IIC 接口实现与IIC设备的通信功能. 示例详解 基于硬件平台: STM32F103C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使 ...

  4. [SQL基础教程]1-4 SQL 表的创建

    [SQL基础教程]1-4 SQL 表的创建 创建数据库 语法 CREATE DATABASE <数据库名称> // example CREATE DATABASE shop; 创建表 语法 ...

  5. [译][Tkinter 教程14] menu 菜单

    已获原作者授权. 原系列地址: Python Tkinter 简介 一提到"menu"这个词, 很多人首先想到的是餐馆里的菜单. 虽然餐馆菜单和计算机程序中的菜单看起来一点也不像, ...

  6. Magento教程 14:如何在Magento设定多货币

    电子商务的应用无远弗届,当你的网路商店已贩售至多个国家,此时你可以在Magento设立多种货币,更能贴近使用者的消费习惯. 接下来我们要示范如何在Magento中设立多货币别. 1. 设立货币 首先进 ...

  7. ArcGIS水文分析实战教程(14)提取水库湖泊等面状水系

    ArcGIS水文分析实战教程(14)提取水库湖泊等面状水系 本章导读:如果说前面章节一直都是针对河流.河网.流域等进行论述,围绕的都是从基本理论到实践操作,那么湖泊.水库等面状水系的提取,就是对水文分 ...

  8. MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航

    MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 原文:MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇 ...

  9. 最全MySQL8.0实战教程 14 MySQL的存储过程 14.2 入门案例

    最全MySQL8.0实战教程 文章目录 最全MySQL8.0实战教程 14 MySQL的存储过程 14.2 入门案例 14.2.1 格式 14.2.2 操作 - 数据准备 14.2.3 操作 - 创建 ...

  10. 最全MySQL8.0实战教程 14 MySQL的存储过程 14.1 概述

    最全MySQL8.0实战教程 文章目录 最全MySQL8.0实战教程 14 MySQL的存储过程 14.1 概述 14.1.1 什么是存储过程 14.1.2 特性 [黑马程序员MySQL知识精讲+my ...

最新文章

  1. [How TO]-如何编写Linux kernel documentation
  2. string和C语言字符串之间的相互转换以及string常用函数
  3. java8新特性(4)— Stream流
  4. 带你揭开IP地址的神秘身份
  5. phpstudy2018选择php7,phpstudy(小皮面板)和phpstudy2018 配置php的区别
  6. 【Elasticsearch】es 增加 删除 节点
  7. Java基础(四) StringBuffer、StringBuilder原理浅析
  8. 【渝粤题库】陕西师范大学180213《消费经济学》作业 (高起本)
  9. 使用PPT编写一个序号抽奖
  10. 食品药品版本库存管理软件
  11. 微信小程序可视化开发工具之动态数据
  12. 飞利浦 PHILIPS 电动牙刷HX6730 拆解
  13. 2022-10-24 dell R740服务器 安装显卡 NVIDIA Tesla P40 24GB
  14. Dubbo comsumer 远程调用流程分析
  15. python图片旋转成水平_python之批量使图片水平翻转
  16. 基于python高仿探迹源码
  17. 联想台式计算机重装系统教程,联想台式机重装win7系统教程
  18. html实现手风琴菜单
  19. ②号团队【扫黑除恶Team】-团队任务5:项目总结会
  20. 武汉大学计算机学院的博士后,武汉大学经济与管理学院

热门文章

  1. jquery.validation.js 表单验证
  2. Windows Mobile之开机自启动
  3. 编写build.xml的12个原则
  4. 阿里P8架构师谈:如何搭建亿级并发系统的性能指标体系
  5. react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
  6. Apache 2.4.28的安装
  7. zabbix邮件报警功能的验证
  8. SQL*Plus生成html文件
  9. 客户端动态化系列之——URLRoute
  10. linux 下 maven 安装配置