工作流编程循序渐进(3:While活动)

工作流编程循序渐进(3:While活动)


作者  朱先忠

一、引言

本文中,我们来学习另一个简单活动--While活动While活动将会持续循环的执行,直至指定判断为假。

下面,我们来构建一个简单的示例。本示例的目的是,想主要使用While活动实现显示一个九九乘法表。

二、创建控制台顺序工作流示例程序框架


请遵循如下步骤创建一个控制台顺序工作流示例程序:
1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为
WhileActivity 的控制台顺序工作流示例程序。
2.之后,系统自动打开工作流设计器界面。
3. 从工具箱中拖动While 活动到图中右侧的汉字提示处,得到如图所示的情形。
File?id=d25b9pk_182hdhk2df2_b

4. 因为是在控制台中显示一个九九乘法表,所以,一定要使用一个二重循环来实现这一目的。也就是说,我们要使用一个嵌套的While活动。另一方面,我们知 道:外层循环与内层循环变量是存在联系的,即在每一次内循环执行完成后,要重新进行某种初始化操作。因此,直接在一个While活动中嵌入一个While 活动是无法实现既定功能的。

另外需要注意的是,While活动仅允许包括一个子活动

但是,还是有解决办法的,我们可以在While活动中嵌入一个复合活动,即一个允许其中继续包含(可能有多个)子活动的活动,例如并行执行活动(Parallel),串行执行活动(Sequence),等等。


5.  为此,我们最终得到如下的工作流图:

File?id=d25b9pk_185dgvkdjfq_b


对于打印一个乘法九九表来说,通常我们可以使用如下一个函数实现:
static void MultiplyTable()
{
    int i = 1;
    int j = 1;

    for (i = 1; i <= 9; i++)
    {
        for (j = 1; j <= i; j++)
        {
            if (i == j)
            {
                Console.Write("{0} * {1}={2} ", i, j, i * j);
                Console.WriteLine("");
            }
            else
                Console.Write("{0} * {1}={2} ", i, j, i * j);
        }
    }

}


于是,我们会得到如下图所示的打印效果:
File?id=d25b9pk_184dzff5ccs_b

下面,我们也想通过工作流操作实现上图打印效果。现在来讨论活动有关属性设置及编码问题。

三、活动有关属性设置及编码

1. 在本例中,我们要使用规则条件表达内外层循环的规则条件。为此,先要定义两个循环变量(以工作流Workflow1)的私有字段的形式存在,如下:
        //创建两个控制内外层循环的变量
        private int i = 0;
        private int j = 1;

2. 单击外、内层两个循环活动whileActivity1和whileActivity2,分别使用属性窗口设置 循环的规则条件以外层循环为例,首先需要选择Condition为“声明性 规则条件 ”。然后,在下面的规则命名中输入名称c1。典型情况(推荐)下,我们单击 规则名称c1右边的“...”省略号进入到规则表达式定义对话框,如图所示:
File?id=d25b9pk_186qsvf229n_b

File?id=d25b9pk_187gwhjxqd9_b
然后,你可以单击“新建”链接创建规则表达式(以后也可以使用“编辑”链接再修改之)。表达式创建窗口如下所示:
File?id=d25b9pk_188x9vdjdcv_b

[注意]上面的表达式后面不允许有
分号 “;”,否则会出现错误提示。

3.同样方式创建 内循环活动whileActivity2 的规则条件为:

this.j <= this.i


4. 根据前面的算法分析,我们要分别创建
内外循环活动的
        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            j = 1;
            i++;
        }

        private void codeActivity2_ExecuteCode(object sender, EventArgs e)
        {
            if (i == j)
            {
                Console.Write("{0} * {1}={2} ", i, j, i * j);
                Console.WriteLine("");
            }
            else
                Console.Write("{0} * {1}={2} ", i, j, i * j);
            j++;
        }


5. 下面是完整的工作流类定义代码:
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Linq;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;

namespace WhileActiviity
{
    public sealed partial class Workflow1 : SequentialWorkflowActivity
    {
        //创建两个控制内外层循环的变量
        private int i = 0;
        private int j = 1;


        public Workflow1()
        {
            InitializeComponent();
        }

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            j = 1;
            i++;
        }

        private void codeActivity2_ExecuteCode(object sender, EventArgs e)
        {
            if (i == j)
            {
                Console.Write("{0} * {1}={2} ", i, j, i * j);
                Console.WriteLine("");
            }
            else
                Console.Write("{0} * {1}={2} ", i, j, i * j);
            j++;
        }

        private void codeActivity3_ExecuteCode(object sender, EventArgs e)
        {
            Console.Read();
        }

    }

}

自不必赘述了吧。

四、运行实例

按F5运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。

File?id=d25b9pk_189fzpcfvgd_b



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值