当前位置:首页 » 《随便一记》 » 正文

delegate使用方法C#(Demo)

26 人参与  2022年10月22日 16:42  分类 : 《随便一记》  评论

点击全文阅读


老鸟路线:

无返回值:   Control  控件父类

namespace System{    [__DynamicallyInvokable]    public delegate void Action<in T>(T obj);}
// 方法原型,方法参数textBox1.Invoke(new Action<string>(str => { textBox1.Text = str; }),"str是参数的名字");

 字符串会代入str 

 这是3个参数的无返回值方法

有返回值

public object Invoke(Delegate method){    return Invoke(method, null);}

无参有返回 

namespace System{    [TypeForwardedFrom("System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089")]    [__DynamicallyInvokable]    public delegate TResult Func<in T, out TResult>(T arg);}

< >内是类型占位符, 最后一个是返回值的类型。 只有1个参数时,括号可不写,直接写参数名字,比如 x

textBox1.Invoke(new Func<string, string>(x => textBox1.Text = x.ToString()),"x是参数名字"); 

 第2个string是返回值的类型。

新手路线:

问题出在哪:在类A内,新建类B,类A是可以调用B的属性和方法,但是B的方法体内,不能调用A的方法。

场景:主窗体内新建了子窗体,主窗体可以调用子窗体所有的属性和方法。但是子窗体方法内不能调用主窗体的方法》最大化,最小化等等方法。

切入点:在学C语言的时候,如果函数体main方法后面,那main的前面必须写函数声明。

C#也是如此。类A 内 using引用了   类B   命名空间,那这个命名空间就相当于全局变量区。(A和B都访问的到) 在类B命名空间下   delegate方法声明。

主窗体是可以访问子窗体属性的,所以把 delegate定义成子窗体的属性(中介)。子窗体当然可以使用自己的属性。子窗体的方法内调用自己的属性。

主窗体把自己的方法绑定给子窗体的属性(中介)。这样子窗体调用的时候间接的调用主窗体的方法。

主窗体程序:

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;/// <summary>/// qq750273008,委托测试/// </summary>namespace delegateTest{    //【1】第1步:声明委托(公共区)    public delegate void WT子呼叫(string str, string str2);//子窗体用    public delegate void WT主广播(string str ,string str2);// 主窗使用 (加载所有子窗的方法)方便统一管理        //主窗体    public partial class Form1 : Form    {        #region 全局变量                UInt16 fromNum = 1;//子窗体编号        WT主广播 wt主广播;//主窗的.属性(用于加载子窗的方法)        private List<Form> forms = new List<Form>();//子窗集合管理对象        #endregion        #region 窗体构造        public Form1()        {            InitializeComponent();        }        #endregion        #region 钮_创建子窗体        private void btn1_创建子窗体(object sender, EventArgs e)        {//创建子窗体            for (int i = 0; i < 3; i++)//每次创建3个窗口            {                Form2 form子窗 = new Form2("子窗体", $"子窗体:{fromNum++}");                form子窗.Show();                //===========================                //【4】第4步:将委托变量和具体方法关联(使用=和+=是一样的效果)                form子窗.wt子呼叫 += x显示子消息;//子窗体 呼叫 主窗体                //===========================                this.wt主广播 += form子窗.父消息;//调用子窗体方法                forms.Add(form子窗);//加入到集合,方便控制            }        }        #endregion        #region 显示消息        //【2】第2步:根据委托编写具体方法        private void x显示子消息(string str, string str2)        {            string str3 = ("来自" + str + " 的消息:" + str2 + "\r\n");            textBox1.AppendText(str3);        }        #endregion        #region 广播        private void btn4_广播(object sender, EventArgs e)        {            try            {                wt主广播("主广播:", textBox2.Text);//wt广播A            }            catch (Exception ex)            {                MessageBox.Show("没有子窗体,无法发送", "失败");                MessageBox.Show(ex.Message);                // throw;            }        }        #endregion        #region 清空        private void btn2_清空(object sender, EventArgs e)        {            textBox1.Text = string.Empty;        }        #endregion        #region 关闭子窗体        private void btn3_关闭子窗体(object sender, EventArgs e)        {//关闭窗口            foreach (var item in forms)            {                item.Close();            }            fromNum = 1;//子窗体编号复位        }        #endregion    }}

子窗体程序:

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 delegateTest{    //子窗体    public partial class Form2 : Form    {        //【3】第3步:声明委托        public WT子呼叫 wt子呼叫;// 属性                 public Form2(string str, string str2)        {            InitializeComponent();            this.Text = str2;                    }        public  void  父消息(string str,string str2)        {            textBox2_接收框.Text = str + str2;        }        private void btn1发送消息(object sender, EventArgs e)//触发按键        {            //【1】第5步:使用委托变量来调用所关联的方法            //wt("测试", "123");            wt子呼叫(this.Text.ToString(), textBox1_发送框.Text.ToString()); // 子窗编号 +  内容        }    }}


点击全文阅读


本文链接:http://zhangshiyu.com/post/45388.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 京圈佛子破戒后,我改嫁京圈纨绔(沈墨渊,白晶晶)
  • 前世被闺蜜害死,重生后我让她从太子妃变疯女苏婉儿,清歌完本_前世被闺蜜害死,重生后我让她从太子妃变疯女(苏婉儿,清歌)
  • 全书浏览七零军嫂太彪悍,带三宝上军区离婚(沈清落,陈桂花,陆有为)_七零军嫂太彪悍,带三宝上军区离婚(沈清落,陈桂花,陆有为)全书结局
  • 今天也没变成昨天(周扬陈默)全书免费_(周扬陈默)今天也没变成昨天后续(周扬陈默)
  • 重生后,秦总非要父以子贵(许沐晴,秦越泽)全书浏览_重生后,秦总非要父以子贵全书浏览
  • 他嫌弃我喝两块钱豆浆上不了台面,我结婚后他又哭又闹全书万照,白青青在线
  • 昭然若梦前尘烬列表_昭然若梦前尘烬(温昭然方池雲)
  • 导师借我股票账号,我倒欠五十万(孟潇潇,宁薇)_导师借我股票账号,我倒欠五十万孟潇潇,宁薇
  • 拒绝把外卖券给舍友,竹马送我到迪拜捡垃圾(周钰泽,蒋清清,思源)全书浏览_拒绝把外卖券给舍友,竹马送我到迪拜捡垃圾全书浏览
  • 我的人生,你已出局(程森凌古楚文)_我的人生,你已出局程森凌古楚文
  • 穿书成病娇女配,睁眼就签下离婚协议书(朱楼)_穿书成病娇女配,睁眼就签下离婚协议书
  • 老婆逼我给白月光捐肾,我死后她悔疯了(宋逸晨沈墨白)全书浏览_老婆逼我给白月光捐肾,我死后她悔疯了全书浏览

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1