C#学习笔记(34)——委托传值(回忆版)

摘要:
表格1.csusing系统;使用System.Collections。通用的使用系统。组件模型;使用系统。数据使用系统。绘画使用系统。Linq;使用系统。文本使用System.Threading。任务;使用System.Windows。形式;namespace_05传递{//1的表单值。定义委派publicdelegatevoidMyDel;publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_单击{//2.绑定委托MyDelmdl=ChangeTxt;//通过构造方法Form2f2=newForm2;f2.ShowDialog();}//初始化Form2定义方法并绑定委托privatevoidChangeTxt{textBox1.Text=str;}}}}过一会儿Form2.csusingSystem;使用System.Collections。通用的使用系统。组件模型;使用系统。数据使用系统。绘画使用系统。Linq;使用系统。文本使用System.Threading。任务;使用System.Windows。形式;namespace_05传递{publicpartialclassForm2:Form{publicForm2(){InitializeComponent();}//的表单值Form2发送了一个新的间谍,privateMyDelmdl;PublicForm2:this(){//新分派的间谍被移交给返回的间谍。新间谍获得远程控制this.mdl=mdl;textBox1.Text=str;}privatevoidbutton1_单击{//3.呼叫代表(新间谍按下遥控按钮,BOOM!!!)mdl;}}操作结果参考:https://www.cnblogs.com/Jacklovely/p/7886612.html补充:1.在过去,在进行表单值传递时,我一直认为委托只能用Form2编写,但实际上它也可以用Form1编写。因为委托是在命名空间下编写的,在类之外,所以只要它在命名空间中,就可以在任何地方调用它!

说明(2018-4-6 20:31:03): 

1. 昨天晚上看三层,看完第一天的最后一节,会员的修改和增加,感觉欲仙欲死,果断关机睡觉。

2. 上午搞了半天哈利波特的原版书epub的下载,结果都没发现一个排版能看的,就连多看卖的正版里面都是字体大小不一,遂决定先把爱丽丝看完再去寻找其他的。

3. 下午2点起床,开始对着电脑冥想,想那个窗体传值怎么弄的来着,拖出两个窗体来,怎么捣鼓都捣鼓不出来,就在这较上劲了,一直想到六点半,吃完我妈擀的面条,又想了一个小时,估计是8点的时候,终于想通了,能够实现传值了。

4. 翻了翻之前的博客,关于委托写了不下十篇了,包括自己写的,从别处抄的。大部分都是讲的委托的基础用法,委托现在在网上已经神乎其神,玄乎其玄,近乎其妖了,怎么讲的都有。然而并没有任何卵用,文章照样看得懂,用的时候照样懵逼。

5. 所以说啊,一个东西你不去实际使用它,就永远不知道怎么用。都说委托是个坎,确实是啊!你不会就只能看会的人装逼,说什么委托其实很简单啊,其实就是个指针嘛,只要理解了就很容易的。。等等屁话。

6. 就是因为不会委托,所以看不下去asp.net,看不下去三层,可以说不会委托,你根本就深入不下去,就好比有一条大河,你要去对岸,就必须要通过委托这座桥,你想直接跳过去是不可能的!

7. 这一下午,我开始一直在想,委托和指针有什么联系,委托是不是存了一个函数的地址?因为之前为了弄清委托原理,我学习了一段时间数据结构,所以老想着往指针上面靠,然后我就去查资料,结果走上了不归路。

8. 在查资料的过程中,看到有人说委托的最大的应用是在设计模式中的观察者模式,于是去找视频,不得不说啊,c#真的是不吃香了,搜设计模式,基本都是Java的,好不容易找到一个讲c#的,讲的是大话设计模式这本书,我手头正好有一本,但是视频里还没讲到委托部分就没了。而且我翻了一下书,里面也只是最基础的运用。我说的基础,就是网上大部分文章介绍的,MyDelegate myDel= SayHello; myDel()这种没有营养的应用。

9. 虽然窗体传值只有几行代码,我却想了6个小时。但当程序实现的那一刻,我的欣喜是难以名状的,甚至现在都还在窃喜,感觉这一天值了。虽然三层里的事件更加复杂,但这也算是入门了吧!

10. 在我最后往代码里加注释的时候,我居然还即兴编出了一个故事!委托被称为代理,但我觉得委托更像是一个间谍!

11. 开始讲故事!

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _05窗体传值
{
    //1.定义委托(MyDel就像是Form2的一个间谍,已经潜入到了Form1中)
    public delegate void MyDel(string str);
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //2.绑定委托(间谍mdl拿到了这颗炸弹的遥控器)
            MyDel mdl = ChangeTxt;
            //Form2通过构造方法进行初始化(此时,通过Form2的载人飞船,间谍mdl可以回到Form2基地)
            Form2 f2 = new Form2(textBox1.Text,mdl);
            f2.ShowDialog();
        }
        //定义方法,一会儿好绑定委托(有人在Form1中埋下了一颗炸弹)
        private void ChangeTxt(string str)
        {
            textBox1.Text = str;
        }
    }
}

Form2.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _05窗体传值
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        //Form2派出新的间谍
        private MyDel mdl;
        public Form2(string str,MyDel mdl):this()
        {
            //新派出的间谍,与返回的间谍交接,新间谍拿到遥控器
            this.mdl = mdl;
            textBox1.Text = str;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //3.调用委托(新间谍按下遥控器按钮,BOOM!!!)
            mdl(textBox1.Text);
        }
    }
}

运行结果参考:https://www.cnblogs.com/Jacklovely/p/7886612.html

补充:

1. 以前做这个窗体传值,一直以为委托只能写在Form2里,但实际上写在Form1里也可以,因为委托写在命名空间下面,类的外面,所以只要是在这个命名空间里的,所有地方都可以调用到这个委托!

2. Form1.cs中,可以不用声明一个委托变量来绑定ChangeTxt方法,可以直接把ChangeTxt方法放进Form2的构造函数里传过去,不过为了好理解,以及符合剧情,我还是加上了。

3. 我觉得这个例子很生动,很天纵奇才,希望有人能看懂,哈哈哈!

免责声明:文章转载自《C#学习笔记(34)——委托传值(回忆版)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHPstorm快捷键Java向下转型的意义下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何确认 fastboot unlock 解锁成功,如何确认DM-verity 已关闭

如何确认 fastboot unlock 解锁成功 1、fastboot 模式下按音量上键后是否提示 Unlock Pass...return to fastboot in 3s 2、重启后界面是否显示 orange state Your deivce has been unlocked and can't be trusted your device w...

关于Linux下conio头文件的实现

在windows下,c语言有库conio.h,实现了不少函数,但是Linux c没有这个库,内部的函数需要自己实现。 //clrsrc清屏函数的一种实现:void clrscr(void) {   system("clear");//需要头文件stdlib.h }//调用system("clear") //getch()函数的一种实现方法#include&...

Java中System.out.println()为何会影响内存可见性?

我们先来看段代码: 1 class ThreadVolatileDemo extendsThread{ 2 static boolean flag=true;//注意该变量没有被volatile修饰 3 @Override 4 public voidrun() { 5 while(flag){ 6 S...

C# 与 SQLite的操作

1、通过Add References引用SQLite ADO .NET安装目录的bin目录下的System.Data.SQLite.DLL。 2、创建数据库文件:因为始终是个0字节文件,应该利用IO也可以(?!)。 System.Data.SQLite.SQLiteConnection.CreateFile(datasource);3、连接数据库 Syst...

C#-执行cmd命令,获取结果

using System; using System.Threading.Tasks; using System.Windows.Forms; namespace EFDemo { public partial class ExecCmd : Form { public ExecCmd() { Initi...

[转]C# 将类的内容写成JSON格式的字符串

将类的内容写入到JSON格式的字符串中 本例中建立了Person类,赋值后将类中内容写入到字符串中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using S...