QuickFlow教程(11)--活动的扩展

时间:2022-08-31 20:27:27

有朋友问用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)先创建一个列表,用来提交请假信息,名称为“请假申请”,并添加开始时间,结束时间,备注三个字段。

QuickFlow教程(11)--活动的扩展

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

QuickFlow教程(11)--活动的扩展

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

QuickFlow教程(11)--活动的扩展

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文件)

QuickFlow教程(11)--活动的扩展

6)配置web.config

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

QuickFlow教程(11)--活动的扩展

修改应用程序目录下的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活动已经出现在工具栏上了

QuickFlow教程(11)--活动的扩展

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

QuickFlow教程(11)--活动的扩展

添加ListItem

QuickFlow教程(11)--活动的扩展

启动流程

QuickFlow教程(11)--活动的扩展
QuickFlow教程(11)--活动的扩展

QuickFlow教程(11)--活动的扩展

QuickFlow教程(11)--活动的扩展

本文示例代码下载:

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);
            }
        }