某些流程场景下,工作流内部逻辑无法判断操作人,或是是判断逻辑太复杂,无法采用QuickFlowDesigner的规则引擎来表达,或者是下一步的操作人直接需要上一步指定,这种情况下,就需要通过UI代码控制工作流活动的操作人了。
最近使用QF的几位朋友都遇到了这种场景,所以写这篇文章介绍一下。
代码控制操作人,需要采用Names类型变量和MultiTask配合实现。
1)添加Names类型变量
Names类型变量实际上是个字符串集合,可以用来存储账号列表,如下图,点击WorkflowVariables编辑按钮,在弹出的工作流变量编辑窗口中,
添加一个名称为NextAprovers,类型为Names的变量。
注意:需要要点击一下Value属性旁边的编辑按钮,这样编辑器能自动进行变量的初始化。
2)添加MultiTask活动
添加一个MultiTak活动,将其User属性绑定到NextApprovers变量
注意:需要点击左边的按钮才会弹出绑定窗口,点击右边按钮会直接弹出值编辑窗口
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