还记得上节中我们留下的那个问题吗?就是在记数的时候,我们不是从1加到10了而中一直在加1,这就与我们的需求不符合了。这怎么呢。我们通过程序可以看到要想做到从1加到10,那么我们必须要把每次循环的的数传进相对应的函数中才行。这要怎么呢。
第一节中我说过了。委托就像我们定义一个函数一个,区别就在前面多了一个delegate,我们只要在定义它时给他定义一个传值就行了。
好了,我们在以前的程序上改动一下就行。
第一步,我们要修改一下委托
//代参数的委托,主要用来在计数框中显示值
public delegate void txtGetNums(int i);
这里我们定义了一个 int i它就是用来传值的
第二步,修改与委托对应的函数(还记得我说过的吗。每个委托都会有一个与其的函数)
/// <summary>
/// 用来显示txtNums里的值的
/// </summary>
/// <param name="i"></param>
public void txtNums(int i)
{
this.txtNum.Text = (Convert.ToInt32(this.txtNum.Text.Trim()) + i).ToString();
}
第三步,修改调用此委托的方法
/// <summary>
/// 无返回值调用方法,用来计数,这里我用了一个Thread.sleep(500)这个大家都应该明白是什么意思,就是让它暂停半秒钟
/// 只有这样,我们才能看到它的变化。
/// </summary>
public void GetNum()
{
for (int i = 1; i <= 10; i++)
{
this.txtNum.BeginInvoke(new txtGetNums(txtNums),i);
Thread.Sleep(500);
}
}
注意我用红色标出的部分。BeginInvoke方面第二个参数是一个object[]类型的.作为给定方法的参数传递的对象数组。如果不需要参数,则可以为 空引用
这里要注意一点是什么,这个值是一个数组,它是与委托定义的值是相对应的,因为咱们只定义了一个int i,所以你在这里只要给值一个i就完了。如果你定义了二个怎么办呢。
下面是MSDN上给出的例子,我认为对理解这个很有帮助。
在按钮事件中我们不用动,还是原来的代码
private void btnAdd_Click(object sender, EventArgs e)
{
this.txtInfo.Text = "开始计数";
//这里初始化一下委托,这里要说明的是,委托中调用的函数不用加()只要一个名字就行了。
getNums gn = new getNums(GetNum);
//因为我们没有任何的返回值,所以BeginInvoke里面就是给null
gn.BeginInvoke(null, null);
this.txtInfo.Text = "我正在计数";
}
试一下,是不是和我们的要求一样呢。呵呵。。。。。。这里留一个问题,你可以试着,在txtInfo中把每次加的数据都显示出来,看一下这个怎么处理。
下面给出完整的代码