none
WF4.0多人审批 RRS feed

  • 问题

  • 你好,流程启动的时候,根据传入的list参数,会动态的生成好多个bookmark,突然发现生成的bookmark是无序的,这样我就没办法确定下一个审批者是谁,请问一下这个该如何处理,谢谢!
      WorkflowApplication instance = null;
            StringBuilder bu = new StringBuilder();
            private void button1_Click(object sender, EventArgs e)
            {
                System.Collections.Generic.Queue<string> nameList = new Queue<string>();
                nameList.Enqueue("001");
                nameList.Enqueue("002");
                nameList.Enqueue("003");
                nameList.Enqueue("004");
                System.Collections.Generic.Dictionary<string, object> dictionary = new Dictionary<string, object>();
                dictionary.Add("BookMarkList", nameList);
                dictionary.Add("Accounting", "Accounting");
                dictionary.Add("InputValue", 1200);
                instance = new WorkflowApplication(new WorkflowConsoleApplication1.Workflow1(), dictionary);
    
                instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
                instance.OnUnhandledException = unhandledExceptionl;
                instance.Aborted = aborted;
                instance.Idle = workflowIdel;
                instance.Run();
    
                bu.AppendLine("流程已经启动");
                SetText(rt, bu.ToString());
                //if (instance.GetBookmarks().Count > 0)
                //{
                //    LblPerson.Text = instance.GetBookmarks()[0].BookmarkName;
                //}     
            }
            void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
            {
                instance = null;
                bu.AppendLine("workflowCompleted:" + e.CompletionState.ToString());
                SetText(rt, bu.ToString());
            }
    
            void aborted(WorkflowApplicationAbortedEventArgs e)
            {
                instance = null;
                bu.AppendLine("aborted ,Reason:" + e.Reason.Message);
                SetText(rt, bu.ToString());
            }
    
            UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e)
            {
                bu.AppendLine("unhandledException:" + e.UnhandledException.Message);
                SetText(rt, bu.ToString());
                return UnhandledExceptionAction.Cancel;
            }
            void workflowIdel(WorkflowApplicationIdleEventArgs e)
            {
                if (e.Bookmarks.Count > 0)
                {
                    SetText(LblPerson, e.Bookmarks[0].BookmarkName);
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                string bookName = LblPerson.Text;
                string inputValue = TxtValue.Text;
    
                if (instance != null)
                {
                    if (instance.GetBookmarks().Count > 0 && instance.GetBookmarks()[0].BookmarkName == bookName)
                    {
                        instance.ResumeBookmark(bookName, inputValue);
                        bu.AppendLine(bookName + "已经审批通过");
                        rt.Text = bu.ToString();
                    }
                    else
                    {
                        bu.AppendLine(bookName + "没有审批通过");
                        rt.Text = bu.ToString();
                        if (instance.GetBookmarks().Count > 0)
                        {
                            bu.AppendLine("还有以下人员需要审批");
                        }
                        foreach (var v in instance.GetBookmarks())
                        {
                            bu.AppendLine(v.BookmarkName);
                        }
                        rt.Text = bu.ToString();
                    }
                }
                else
                {
                    bu.AppendLine(bookName + "没有创建实例");
                    rt.Text = bu.ToString();
                }
            }
    
            private delegate void SetTextDelegate(Control control, string value);
            private void SetText(Control control, string value)
            {
                if (this.InvokeRequired)
                {
                    SetTextDelegate d = new SetTextDelegate(SetText);
                    control.Invoke(d, new object[] { control, value });
                }
                else
                {
                    control.Text = value;
                }
            }
    

    2011年11月23日 7:26

答案

全部回复

  • 你好,

    根据文章的解释,使用ParallelFor活动,BookMark创建的顺序是从BookMarkList的最后依次到第一个。所以BookMark的顺序取决于如何建立输入参数和集合BookMarkList的关系。谢谢。

     


    Leo Tang [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2011年11月25日 7:33
    版主
  • 你好,谢谢。确实是返过来的。还有个问题是关于节点动态调整的。我发现状态机和flowchart很相似,但是不管是flowchart或者状态机工作流,就是不知道如何通过程序,不需要通过预先设置好的流程,动态的让程序跳转或者返回到某个节点。
    2011年11月26日 16:38