zoukankan      html  css  js  c++  java
  • QuickFlow教程(11)活动的扩展

    有朋友问用QF的时候一些具体的功能如何实现,如以下的问题:

    “我用的是 vs2008+quickflow+infopath,想在vs 代码里来更新文档库中项的值 同时还需要更新其他相关联的列表项的值”

    QF的基础是WF3.5和SharePoint本身的功能,然后提供了Flowchart类型的流程和一些常用的活动,显然,QF不可能考虑到所有的业务场景,不可能提供对所有功能的内在支持。

    幸运的是,WF本身具有很强的扩展性,而QF并没有把这些扩展性屏蔽掉。基于QF的扩展开发包含以下内容:

    1)EventBus的扩展,见SharePoint工作流解决方案QuickFlow系列(6)—事件总线(EventBus)

    2)开发自定义的Activity,包含两种活动:

    • 原生的WF活动。QF支持原生的WF活动,但是原生WF活动不能放到Flowchart的根下,必须采用Step活动包装(即先添加一个Step活动,然后再Step活动中即可添加任意其他活动)
    • QF的活动,支持直接添加到Flowchart的根下,并可以画线连接其他活动。

    本篇文章就来讲解下QF活动的扩展开发,原生QF活动的开发可以参照QF活动。

    本文以一个简单的请假审批流程作为示例:  员工提交请假申请,部门经理审批,审批通过后,自动添加一个日历项到日历列表中。

    1)先创建一个列表,用来提交请假信息,名称为“请假申请”,并添加开始时间,结束时间,备注三个字段。

    image

    2)新建一个Workflow Activity Library类型的项目,名称为QFExtensions.

    image

    3)添加对QuickFlow.dll和Microsoft.SharePoint.dll的引用

    image

    Microsoft.SharePoint.dll在目录C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI中

    将QuickFlow.wsp改名为QuickFlow.cab,然后解压缩,即可得到QuickFlow.dll

    4)将活动名称改为AddCalendar, 基类改为QuickFlow.SPSequenceActivity。

    所有可以添加到Flowchart跟上的活动都必须继承于SPSequenceActivity。

    然后重载Execute方法,编写添加日历项的代码:

    [ToolboxItem(typeof(ActivityToolboxItem))]
        [Designer(typeof(ActivityDesigner), typeof(IDesigner))]
    	public partial class AddCalendar: QuickFlow.SPSequenceActivity
    	{
    		public AddCalendar()
    		{
    			InitializeComponent();
    		}
    
            protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
            {
                SPWeb web = this.WorkflowProperties.Web;
    
                SPList calendarList = web.Lists["Calendar"];
    
                SPListItem item = calendarList.Items.Add();
    
                item["Title"] = "请假:" + this.WorkflowProperties.Item.Title;
                //此处的Start Time等日历列表的字段需要实际版本修改,这儿是英文版上的字段名
                item["Start Time"] = this.WorkflowProperties.Item["开始时间"];
                item["End Time"] = this.WorkflowProperties.Item["结束时间"];
                item["Description "] = this.WorkflowProperties.Item["备注"];
    
                item.Update();
    
                return ActivityExecutionStatus.Closed;
            }
    	}
     

    5)将项目进行强签名,然后将QFExtensions.dll部署到GAC中,(直接将dll拖拽到C:\Windows\assembly或者执行示例项目中的GAC.bat文件)

    image

    6)配置web.config

    用Reflector打开QFExtensions.dll,找到程序集的全名

    image

    修改应用程序目录下的web.config,在authorizedTypes节点中添加配置:

    <authorizedType Assembly="QFExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=25e4e899ff9bd7c5" Namespace="QFExtensions" TypeName="*" Authorized="True" />

    7)配置QuickFlowDesigner。

    打开QuickFlowDesigner目录下的ToolboxItems.txt文件,添加一行配置:

    QFExtensions.AddCalendar,QFExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=25e4e899ff9bd7c5

    8)启动QFD,可以看到AddCalendar活动已经出现在工具栏上了

    image

    9)画出流程图,发布流程,可以看看效果了

    image

    添加ListItem

    image

    启动流程

    image
    image

    image

    image

    本文示例代码下载:

    http://cid-7f5a25cdf47d03e6.skydrive.live.com/self.aspx/QuickFlow/Examples/QFExtensions^_AddCalendar.zip

    后记:有朋友问:如何怎样写带有属性的扩展组件?

    编写WF活动的所有经验都可以用于QuickFlow的活动开发,对这个问题,只要给活动声明属性即可,假设要修改AddCalendar的代码,使日历列表的名字可以配置,代码如下:

    [ToolboxItem(typeof(ActivityToolboxItem))]
        [Designer(typeof(ActivityDesigner), typeof(IDesigner))]
    	public partial class AddCalendar: QuickFlow.SPSequenceActivity
    	{
    		public AddCalendar()
    		{
    			InitializeComponent();
    		}
    
         public  string ListName{get;set;}
    
            protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
            {
                SPWeb web = this.WorkflowProperties.Web;
    
                SPList calendarList = web.Lists[this.ListName];
    
                SPListItem item = calendarList.Items.Add();
    
                item["Title"] = "请假:" + this.WorkflowProperties.Item.Title;
                //此处的Start Time等日历列表的字段需要实际版本修改,这儿是英文版上的字段名
                item["Start Time"] = this.WorkflowProperties.Item["开始时间"];
                item["End Time"] = this.WorkflowProperties.Item["结束时间"];
                item["Description "] = this.WorkflowProperties.Item["备注"];
    
                item.Update();
    
                return ActivityExecutionStatus.Closed;
            }
    	}

    以上的代码中采用的是普通属性,普通属性在设计器中只能直接赋值,无法进行绑定,若要添加可以绑定的属性,则需要用WF中的依赖属性,将ListName声明修改如下:

    public static DependencyProperty ListNameProperty = 
                DependencyProperty.Register("ListName", typeof(System.String), typeof(AddCalendar));   
    
            [ValidationOption(ValidationOption.Required)]
            [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
            [BrowsableAttribute(true)]
            [CategoryAttribute("Misc")]
            public String ListName
            {
                get
                {
                    return ((string)(base.GetValue(ListNameProperty)));
                }
                set
                {
                    base.SetValue(ListNameProperty, value);
                }
            }
  • 相关阅读:
    Integer的疑惑
    简单选择排序算法
    冒泡排序
    插入排序算法java
    BinaryOperator<T>接口的用法示例+BiFunction
    装箱和拆箱、类型比较
    java的Junit的用法(转发)
    htmlnav
    好用的壁纸网站大全
    c# 财务数据编号的生辰
  • 原文地址:https://www.cnblogs.com/jianyi0115/p/1708983.html
Copyright © 2011-2022 走看看