首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF 核心教學第九章:掌握邏輯流活動(IfElse、While、Replicator)

     編輯:關於.NET

Windows Workflow Foundation (WF) 的強大之處在於能將複雜的業務邏輯視覺化、模組化。在前幾章中,我們已學會如何執行代碼、處理異常、暫停與終止工作流。然而,任何完整的電腦系統都必須具備「根據運行時條件做出判斷、執行不同任務」的能力。本章將深入探討三大核心邏輯流活動:IfElse(條件分支)、While(迴圈判斷)與 Replicator(模擬 for 迴圈),並透過一個「問卷調查」實戰範例,示範如何靈活運用它們來簡化工作流設計。

核心概念:條件與條件處理

WF 提供了基於運行時條件進行邏輯控制流的活動。本章採用 CodeCondition 方式——在 C# 代碼中撰寫條件邏輯(第 12 章將介紹基於規則的 RuleCondition)。兩種方式各有優勢,開發者可根據專案需求選擇。

實戰範例:Questioner 問卷應用程式

本章範例為一個 Windows Forms 應用程式,包含三個可自訂的「是/否」問題,支援兩種模式:

  • 相依模式:前一題答錯(否),後續題目自動視為否,不再提問。
  • 獨立模式:每題互不影響,皆須逐一作答。

工作流將回答收集為 Boolean[] 陣列回傳宿主,UI 以藍/綠/紅圓球即時顯示進度與結果(全對顯示綠球,否則顯示「8」字球)。

圖9-1 Questioner 主應用程式介面

圖9-2 Questioner 執行期間介面

活動一:IfElse 活動——模擬 if-then-else 分支

IfElse 是最直觀的條件分支活動。它包含左右兩個分支,左邊對應 true,右邊對應 false。每個分支都是容器,可放入任意活動。使用步驟如下:

  1. 拖曳 IfElse 到設計器,設定左分支的 Condition 屬性為「代碼條件」,輸入事件處理器名稱(如 AskQuestion1)。
  2. 在事件處理器中彈出 MessageBox 詢問問題,將結果寫入 e.Result。
  3. 左分支放入 Code 活動(AffirmQ1),右分支放入 Code 活動(NegateQ1),分別處理肯定/否定邏輯。
  4. 重複上述步驟處理第 2、3 題,並根據 Dependent 屬性決定是否跳過後續提問。
  5. 最後加入自訂活動 SendResponseDataToHost 將結果回傳宿主。

IfElse 活動設計器 設定 Condition 屬性 加入 Code 活動 右分支 Code 活動 左分支 Code 活動 完成第一題設計 加入第二題 IfElse 完成三題 IfElse 設計 SendResponseDataToHost 活動 設定 responses 陣列 Boolean 集合編輯器 加入 CopyResponse Code 活動

觀察:使用 IfElse 處理重複性提問需 31 步驟,工作流圖顯得冗長。這提示我們:對於「重複執行相似邏輯」的場景,迴圈結構更合適。

活動二:While 活動——簡化重複邏輯

While 活動在條件為 true 時持續迴圈,條件為 false 時結束。它極大地簡化了問卷流程:

  1. 拖曳 While 到設計器,設定 Condition 為 TestComplete。
  2. 在 While 內部放入單一 Code 活動 AskQuestion,透過索引 _qNum 依序提問。
  3. 在 TestComplete 中判斷是否遍歷完所有問題,決定 e.Result。
  4. 在 AskQuestion 中處理相依邏輯:若回答為否且為相依模式,直接將剩餘題目標記為否並遞增索引至結束。

While 活動設計器 While Condition 設定 TestComplete 事件 While 內部 Code 活動 加入 SendResponseDataToHost

對比:While 版本工作流圖極度精簡,直觀展示「迴圈詢問、條件結束」的核心邏輯,維護性大幅提升。

活動三:Replicator 活動——模擬 for 迴圈的強大工具

Replicator 並非單純對應 C# for 迴圈,更像 ASP.NET Repeater 控制項:它根據 IList 資料源的項目數量,動態複製唯一的子活動(容器),支援循序或平行執行。核心屬性與事件如下:

屬性功能
ExecutionTypeSequence(循序)或 Parallel(平行)
InitialChildData綁定 IList 集合,每個元素對應一個子活動實例
事件觸發時機
InitializedEventReplicator 啟動時,僅一次
ChildInitializedEvent每個子活動初始化後
UntilCondition每個子活動執行前,Result=false 繼續,true 終止
ChildCompleteEvent每個子活動完成後
CompleteEvent所有子活動完成後

Replicator 事件觸發流程圖

Replicator 實作問卷流程

  1. 拖曳 Replicator,設定事件:Initialized=InitializeLoop、Completed=LoopCompleted、ChildInitialized=PrepareQuestion、ChildCompleted=QuestionAsked、UntilCondition=TestContinue(代碼條件)。
  2. 在 Replicator 內放入唯一 Code 活動 AskQuestion。
  3. 建立整數陣列 _qNums 對應題目索引,在 InitializeLoop 中綁定至 InitialChildData。
  4. PrepareQuestion 從 e.InstanceData 取得當前題號;AskQuestion 彈出提問並記錄回答;QuestionAsked 將結果寫入 _response。
  5. TestContinue 判斷:若相依模式且當前答否,標記剩餘為否並終止;若已處理最後一題則終止;否則繼續。
  6. LoopCompleted 將結果指派給回傳活動。

Replicator 設計器初始 Initialized 事件 Completed 事件 ChildInitialized 事件 ChildCompleted 事件 UntilCondition 設定 TestContinue 事件 Replicator 內部 Code 活動 完整 Replicator 工作流

結論:三種活動各有適用場景——IfElse 適合靜態分支,While 適合動態條件迴圈,Replicator 適合基於集合的批次處理,且支援平行化。實務上應根據業務複雜度選擇最簡潔的方案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved