zoukankan      html  css  js  c++  java
  • C# delegate 学习 (练这么久终于悟出来点东东了,继续加油! ^_^)

    前言

      从事开发工作两年有余了,但还是对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

     

        

     

  • 相关阅读:
    Oracle根据【日期】组,其他条件根据PIVOT行转列。使每个日期条件关联的其他数据只有一行。
    ORACLE数据库,数据量大,转移数据到备份表语句
    C#解析"a=1&b=2&c=3"字符串,微信支付返回字符串,替换<br>为&
    dataTable的数据,调试的时候点放大镜就看到了啊啊啊!
    Debug和Release 老程序啊 调试之前 区分一下啊
    FastReport.NET
    grpc 实现微服务生态笔记
    金木水火土
    shell 指令分析nginx 日志qps
    idea中使用tomcat 方式启动spring boot项目
  • 原文地址:https://www.cnblogs.com/xw-yanger/p/3596225.html
Copyright © 2011-2022 走看看