前言

  从事开发工作两年有余了,但还是对Delegate,Event神马的看见就头疼,文章看过无数,自己也练习过好多遍,但到用的时候或者人家换了一种形式之后就又不懂了,哎~智商捉急啊!!

但是,这两天的收获还是不错的~!所以筒子们一定要有信心+几分坚持,回头一看,原来是这么简单。

正文

  下面是我练习时做的一个小例子,在这记录下来,一是提醒自己,二来也许还能帮助到别人。:P

  跟着我的思路走,你会发现 so easy.

一、祝福传递功能

  流程如图:

  

  1、第一步很简单,就不多说了。但是注意要设置frm3.MdiParent = this;

            Form3 frm3 = new Form3();
frm3.MdiParent = this;
frm3.Show();

  2、来看第二步,首先要明确我们的目的是什么?

    1)修改Form3中的ListBox1中的值;

    2)改变背景色为Green。

    那么两件事,我们就需要两个方法来完成(这里有人会想:笨,这么简单的需求放到一个方法不就行了么?因为真正的项目需求是不会这么简单的,呵呵)。

    这两件事都是针对Form3的,所以我们把这两个方法加到Form3里面。

        //更新文字方法
public void SetText(string text)
{
this.listBox1.Items.Add(text);
}
//更新背景颜色方法
public void SetColor(Color color)
{
this.BackColor = color;
}

    OK,方法加进去之后,我们继续走,单击Open,打开模式窗体frmContent。

            frmContent content = new frmContent();
content.ShowDialog();

    3、在下拉框选择完对应的的类型之后,点击添加进行传值+修改颜色,只需简单几步,然后就大功告成了!哈哈

      1)声明委托。(跟方法的声明一样,只不过多加一个delegate,还有不需要方法体)

        public delegate void GetTextHandle(string text);    //申明委托
public delegate void GetColorHandle(Color color); //申明委托

      2)实例化。(紧接着,下一步就进行实例化,还是一样,方法怎么实例化,委托就怎么实例化,这里给一个null值)

        public GetTextHandle getTextHandle = null;
public GetColorHandle getColorHandle = null;

      3)使用。(使用前要做非空判断,然后将textBox1中的值传递过去就哦了)

        private void button1_Click(object sender, EventArgs e)
{
if (getTextHandle != null)
{
getTextHandle(this.textBox1.Text);
}
if (getColorHandle != null)
{
getColorHandle(Color.Green);
}
}

    好了,是不是迫不及待想感受下成果,运行试试看,咦?为毛点了添加没反应??

    跟踪代码发现 getTextHandle 为空!这是为什么呢?

    仔细观察一下,发现第二步和第三步在委托这块基本没半毛钱关系,难怪会点了没反应。

    所以我们需要在第二步加入一行代码:

            frmContent content = new frmContent();
content.getTextHandle = SetText;
       content.getColorHandle = SetColor;
content.ShowDialog();

    这段话的意思就是将SetText和SetColor方法当参数传递给frmContent的getTextHandle和getColorHandle。

    OK,现在应该是没什么问题了。

    为了进一步加深理解,我们还要增加一个功能,没错,在frmContent界面的类型后面还有一个添加按钮,那么这个按钮的功能是什么呢?

二、动态添加祝福类型

    1、跟上面一样,还是先搞清楚需求,这里很简单,我们需要给frmContent窗体的祝福类型下面加Item

     那么先写方法吧。

        public void AddCbo(string text)
{
this.comboBox1.Items.Add(text);
}

    2、添加事件

        private void button2_Click(object sender, EventArgs e)
{
Form4 frm4 = new Form4();
frm4.setValue = AddCbo; //注意这里
frm4.ShowDialog();
}

    3、Form4窗体代码

        public delegate void SetValue(string text);
public SetValue setValue = null; private void button1_Click(object sender, EventArgs e)
{
if (setValue!=null)
{
setValue(textBox1.Text);
}
}

    OK,至此,委托就完了,当然这些只是皮毛,后续我会慢慢补充完整!

    欢迎大家来我的博客参观:http://www.cnblogs.com/xw-yanger/

    demo下载地址:Demo

    

随机推荐

  1. PHP图标类库 - JpGraph使用详解

    http://w3note.com/web/181.html 微信平台开发的推广支持应用里,为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二 ...

  2. hdu 1133 Buy the Ticket

    首先,记50的为0,100的为1. 当m=4,n=3时,其中的非法序列有0110010; 从不合法的1后面开始,0->1,1->0,得到序列式0111101 也就是说,非法序列变为了n-1 ...

  3. 2013 ACM-ICPC长沙赛区全国邀请赛——Bottles Arrangement

    这题当时竟然没看啊…… 找规律:求和m+m+m-1+m-1+……前n项 ;}

  4. C# 计算一段代码执行的时间函数

    使用 Stopwatch 类 eg:  计算一个for循环需要的时间 Stopwatch watch = new Stopwatch(); watch.Start(); ; i < ; i++) ...

  5. C Primer Plus之C预处理器和C库

    编译程序前,先由预处理器检查程序(因此称为预处理器).根据程序中使用的预处理器指令,预处理器用符号缩略语所代表的内容替换程序中的缩略语. 预处理器不能理解C,它一般是接受一些文件并将其转换成其他文本. ...

  6. Android Activity生命周期 onSaveInstanceState和onRestoreInstanceState

    当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候. 注意上面 ...

  7. 关于JS中变量的作用域-实例

    先看问题,如下,自己运行一下吧! if (!('_qyzA' in window)) { var _qyzA = 1; } alert(_qyzA);//undefined 分析:首先,所有的全局变量 ...

  8. Windows下gcc以及Qt的DLL文件调用之总结(三种方法)

    DLL与LIB的区别 :1.DLL是一个完整程序,其已经经过链接,即不存在同名引用,且有导出表,与导入表lib是一个代码集(也叫函数集)他没有链接,所以lib有冗余,当两个lib相链接时地址会重新建立 ...

  9. ASP.NET获取路径的方法

    原文:[转载]ASP.NET获取路径的方法 HttpContext.Current.Request.PhysicalPath;    // 获得当前页面的完整物理路径.比如 F:\XFU.NSQS\p ...

  10. PCL—低层次视觉—点云分割(基于形态学)

    1.航空测量与点云的形态学 航空测量是对地形地貌进行测量的一种高效手段.生成地形三维形貌一直是地球学,测量学的研究重点.但对于城市,森林,等独特地形来说,航空测量会受到影响.因为土地表面的树,地面上的 ...