从技术上讲,您可以创建一个使用不同字段的自定义任务类型,并将所有用户名存储在其中,然后使用自定义任务表单逐一检查它们...但如果您使用它实际上要简单得多并行创建多个任务。
这是一个如何做到这一点的示例,http://msdn.microsoft.com/en-us/library/hh128696.aspx(也请观看视频!)但是——他的示例中有一部分是一种不好的做法:他在 Replicator 的 Initialized 事件中初始化 InitialChildData IList活动...这就是为什么他必须在其中初始化第一个孩子,而其余的都在 ChildInitialized 事件中...正确的方法是在您到达复制器并设置您的 IList 之前立即运行代码活动。然后,您可以将所有实际初始化代码留在 childInitialized 处理程序中。在我现实生活中的工作版本中,我根本没有复制器初始化处理程序。
我将介绍一个与上面链接的 Scot Hilier 一起使用的示例,例如勘误表附录类型的东西,所以当您意识到这段代码不是完整的解决方案时不要生气。
例如,如果我的多审批者列表使用我的工作流的逗号分隔字符串属性,称为 Assignees(也许我从工作流的初始化数据中获取它,也许是以前的任务表单......那是你自己的事)
private void prepareCodeActivity_Invoked(object sender, EventArgs e) {
Assignees = DesignatedApprovers.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
}
在这种情况下,Assignees 是一个 List,我已将复制器的 InitialChildData 属性绑定到它
private void replicateTasks_ChildInitialized(object sender, ReplicatorChildEventArgs e) {
// do all of your task setup here (e.InstanceData is the single string for this child)
// note I'm setting properties of my custom activity, not the task itself
// each child instance of the replicator gets it's own instance of it.
generalApprovalTask.TaskAssignedTo = e.InstanceData.ToString();
generalApprovalTask.TaskTitle = string.Format(MyStrings.GeneralApprovalTaskTitle,
workflowProperties.Item.File.Name)
// log something!
}
只是希利尔先生的一个小疏忽,但通常是一个很好的例子,所以我们会原谅他。
如果您想检查结果,请在复制器的 ChildCompleted 处理程序中进行。 (Hilier 先生也不涉及这部分。)
public int FailedApprovals { get; set; }
/// <summary>
/// This is called upon the completion of the child tasks. Here is where we check the outcome.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void replicateTasks_ChildCompleted(object sender, ReplicatorChildEventArgs e) {
if (e.Activity is MyGeneralApprovalTaskActivity) {
var act = e.Activity as MyGeneralApprovalTaskActivity;
if (act.TheTaskOutcome != MyStrings.ApprovedString) {
FailedApprovals++;
}
// log something!
}
}