QuickFlow教程(14)—ExecuteCode using QuickFlowDesigner
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相关推荐
- Directx11教程(14) D3D11管线(2)
Directx11教程(14) D3D11管线(2) 原文:Directx11教程(14) D3D11管线(2) 下面我们来了解一些GPU memory的知识,主要参考资料:http://fgiese ...
- STM32 进阶教程 14 - 程序加密之FLASH读写保护
前言 在嵌入式应用开发中,应用开发完成后往往需要对芯片中的程序进行加密处理,用以保护程序安全(不至被竞争对手从芯片把程序固件考走),本节将给大学介绍一个如何实现程序自动给芯片加密功能.学完本节内容,你 ...
- STM32 基础系列教程 14 - IIC
前言 学习stm32 IIC接口的使用,用IIC 接口实现与IIC设备的通信功能. 示例详解 基于硬件平台: STM32F103C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使 ...
- [SQL基础教程]1-4 SQL 表的创建
[SQL基础教程]1-4 SQL 表的创建 创建数据库 语法 CREATE DATABASE <数据库名称> // example CREATE DATABASE shop; 创建表 语法 ...
- [译][Tkinter 教程14] menu 菜单
已获原作者授权. 原系列地址: Python Tkinter 简介 一提到"menu"这个词, 很多人首先想到的是餐馆里的菜单. 虽然餐馆菜单和计算机程序中的菜单看起来一点也不像, ...
- Magento教程 14:如何在Magento设定多货币
电子商务的应用无远弗届,当你的网路商店已贩售至多个国家,此时你可以在Magento设立多种货币,更能贴近使用者的消费习惯. 接下来我们要示范如何在Magento中设立多货币别. 1. 设立货币 首先进 ...
- ArcGIS水文分析实战教程(14)提取水库湖泊等面状水系
ArcGIS水文分析实战教程(14)提取水库湖泊等面状水系 本章导读:如果说前面章节一直都是针对河流.河网.流域等进行论述,围绕的都是从基本理论到实践操作,那么湖泊.水库等面状水系的提取,就是对水文分 ...
- MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航
MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 原文:MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航 上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇 ...
- 最全MySQL8.0实战教程 14 MySQL的存储过程 14.2 入门案例
最全MySQL8.0实战教程 文章目录 最全MySQL8.0实战教程 14 MySQL的存储过程 14.2 入门案例 14.2.1 格式 14.2.2 操作 - 数据准备 14.2.3 操作 - 创建 ...
- 最全MySQL8.0实战教程 14 MySQL的存储过程 14.1 概述
最全MySQL8.0实战教程 文章目录 最全MySQL8.0实战教程 14 MySQL的存储过程 14.1 概述 14.1.1 什么是存储过程 14.1.2 特性 [黑马程序员MySQL知识精讲+my ...
最新文章
- [How TO]-如何编写Linux kernel documentation
- string和C语言字符串之间的相互转换以及string常用函数
- java8新特性(4)— Stream流
- 带你揭开IP地址的神秘身份
- phpstudy2018选择php7,phpstudy(小皮面板)和phpstudy2018 配置php的区别
- 【Elasticsearch】es 增加 删除 节点
- Java基础(四) StringBuffer、StringBuilder原理浅析
- 【渝粤题库】陕西师范大学180213《消费经济学》作业 (高起本)
- 使用PPT编写一个序号抽奖
- 食品药品版本库存管理软件
- 微信小程序可视化开发工具之动态数据
- 飞利浦 PHILIPS 电动牙刷HX6730 拆解
- 2022-10-24 dell R740服务器 安装显卡 NVIDIA Tesla P40 24GB
- Dubbo comsumer 远程调用流程分析
- python图片旋转成水平_python之批量使图片水平翻转
- 基于python高仿探迹源码
- 联想台式计算机重装系统教程,联想台式机重装win7系统教程
- html实现手风琴菜单
- ②号团队【扫黑除恶Team】-团队任务5:项目总结会
- 武汉大学计算机学院的博士后,武汉大学经济与管理学院