QuickFlowDesigner教程(4)如何用代码控制活动操作人

某些流程场景下,工作流内部逻辑无法判断操作人,或是是判断逻辑太复杂,无法采用QuickFlowDesigner的规则引擎来表达,或者是下一步的操作人直接需要上一步指定,这种情况下,就需要通过UI代码控制工作流活动的操作人了。

最近使用QF的几位朋友都遇到了这种场景,所以写这篇文章介绍一下。

代码控制操作人,需要采用Names类型变量和MultiTask配合实现。

1)添加Names类型变量

Names类型变量实际上是个字符串集合,可以用来存储账号列表,如下图,点击WorkflowVariables编辑按钮,在弹出的工作流变量编辑窗口中,

添加一个名称为NextAprovers,类型为Names的变量。

注意:需要要点击一下Value属性旁边的编辑按钮,这样编辑器能自动进行变量的初始化。

image

2)添加MultiTask活动

添加一个MultiTak活动,将其User属性绑定到NextApprovers变量

注意:需要点击左边的按钮才会弹出绑定窗口,点击右边按钮会直接弹出值编辑窗口

image

3)编写UI代码

如果在工作流启动的时候控制第一步的操作人,需要处理StartWorkflowButton按钮的Executing事件:

protected void Page_Load(object sender, EventArgs e)
  {
      this.StartWorkflowButton1.Executing += new EventHandler<System.ComponentModel.CancelEventArgs>(StartWorkflowButton1_Executing);

  }

void StartWorkflowButton1_Executing(object sender, System.ComponentModel.CancelEventArgs e)
   {
       QuickFlow.NameCollection nextUsers = new QuickFlow.NameCollection();
       nextUsers.Add("codeartserver\\administrator");
       nextUsers.Add("codeartserver\\appservice");

       QuickFlow.Core.WorkflowContext.Current.UpdateWorkflowVariable("NextApprovors", nextUsers);
   }

如果在提交一个任务是控制下一个任务的操作人,需要处理ActionsButton的ActionExecuting事件:

protected void ActionsButton1_ActionExecuting(object sender, QuickFlow.UI.Controls.ActionEventArgs e)
   {

       NameCollection nextUsers = new QuickFlow.NameCollection();
       nextUsers.AddRange( this.txtNextApprovor.Text.Split(','));

       QuickFlow.Core.WorkflowContext.Current.UpdateWorkflowVariable("NextApprovors", nextUsers);
   }

其实,只要在工作流提交前更新工作流变量即可,在Page_Load中给工作流变量赋值也是可以的:

protected void Page_Load(object sender, EventArgs e)
  {
      QuickFlow.NameCollection nextUsers = new QuickFlow.NameCollection();
      nextUsers.Add("codeartserver\\administrator");
      nextUsers.Add("codeartserver\\appservice");

      QuickFlow.Core.WorkflowContext.Current.UpdateWorkflowVariable("NextApprovors", nextUsers);
  }

注:最新代码支持这个特性:http://quickflow.codeplex.com/releases/view/34627

4)如果是用户指定操作人的情况下,可以直接采用MOSS内部的PeopleEditor控件,

Aspx:

<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<SharePoint:PeopleEditor id="PeopleEditor1" runat="server"
    SelectionSet="User"
    ValidatorEnabled="true"
    AllowEmpty = "false"
    MultiSelect = "true"
/>

Code:

protected void Page_Load(object sender, EventArgs e)
  {
      QuickFlow.NameCollection nextUsers = new QuickFlow.NameCollection();
      nextUsers.Add(PeopleEditor1.CommaSeparatedAccounts.Split(‘,))
      QuickFlow.Core.WorkflowContext.Current.UpdateWorkflowVariable("NextApprovors", nextUsers);
  }

 后记:

代码控制操作人也可以利用动态角色和RuleDriven或者RoleTask来实现,见:

http://www.cnblogs.com/jianyi0115/archive/2010/01/28/1658822.html 

原文地址:https://www.cnblogs.com/jianyi0115/p/1645941.html