第二十六节 深入委托实例补充
来源:互联网 发布:gopro studio for mac 编辑:程序博客网 时间:2024/05/17 04:24
委托,事件,匿名方法,扩展方法等,这些只有通过多多的练习才能有更深入的领悟。有些概念是想不通的,只有做了才能稍有明白,只有多做才能真正明白。我做的这个实例只是比葫芦画瓢而矣:
一个委托类(Add),一个主窗体Form1,一个子窗体Form2(实现窗体互动)
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace WF26{ public delegate void addDelegate(string s1, int i, string s3); public static class Add { public static event addDelegate addEvent; public static void senInfo(string s1, int i, string s3) { addEvent(s1, i, s3); } }}
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WF26{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// <summary> /// 将用户输入添加到列表项中来 /// </summary> /// <param name="s1">姓名</param> /// <param name="s2">年龄</param> /// <param name="s3">住址</param> public void Add_addEvent(string s1, int i, string s3) { ListViewItem lvi = new ListViewItem(s1);//Listview特有的类,代表一行 lvi.SubItems.Add(i.ToString()); lvi.SubItems.Add(s3); livInfo.Items.Add(lvi);//添加到列表项 } /// <summary> /// 主窗体加载的同时运行委托 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { livInfo.Items.Clear(); //委托好似一座桥梁,它将Add_addEvent方法作为addEvent事件的一个执行者 //如果有返回值呢? Add.addEvent += new addDelegate(Add_addEvent); } /// <summary> /// 显示子窗体 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnAdd_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.Show(); } /// <summary> /// 删除员工 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnDel_Click(object sender, EventArgs e) { if (livInfo.SelectedItems.Count > 0) { //如果被选择项数目大于0 foreach (ListViewItem lvi in livInfo.SelectedItems) { //遍历被选择的每一项,并删除 livInfo.Items.Remove(lvi); } } } }}
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WF26{ public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { //无加载 } private void btnOK_Click(object sender, EventArgs e) { try { //调用委托类中的一个被监视方法 Add.senInfo(tbName.Text, Convert.ToInt32(tbAge.Text), tbAddr.Text); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { //清空 tbName.Text = ""; tbAge.Text = ""; tbAddr.Text = ""; } //关闭本窗口 this.Close(); } }}
执行的结果:
为了能记忆长久,更重要的还是理解上,我不断的在用实践体会:以下是对匿名方法和Lamada表达式及委托与方法的关系的练习:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Con26_2{ class Program { /// <summary> /// 定义一个有参数有返回值委托类 /// </summary> /// <returns>返回整型值</returns> public delegate int delegateHandler(int a,int b); static void Main(string[] args) { Console.WriteLine("请输入二元运算的第一个整型数字:"); int Number1 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入二元运算的第二个整型数字:"); int Number2 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请问您预想进行什么运算?+,-,*,/:"); string str = Console.ReadLine(); int result = 0; delegateHandler dh = null; switch (str) { case "+": dh = Add; break; case "-": dh = Sub; break; case "*": dh = Mul; break; case "/": dh = Div; break; default: Console.WriteLine("请重新输入:"); str = Console.ReadLine(); break; } result = dh(Number1, Number2); //写个匿名方法 dh = delegate(int a,int b) { return a % b; }; int t1 = dh(10, 3); //Lamada表达式 dh = (a, b) => a + b; int t2 = dh(23, 90);//注意在Lamada表达中,定义的委托类中是有返回值的,但Lamada中并没有return Console.WriteLine("您的答案是:{0}",result); Console.WriteLine("匿名方法所得结果是:{0}", t1); Console.WriteLine("Lamada所得结果是:{0}", t2); Console.ReadLine(); } /// <summary> /// 加法运算 /// </summary> /// <param name="a">整数a</param> /// <param name="b">整数b</param> /// <returns>整数</returns> public static int Add(int a, int b) { return a + b; } /// <summary> /// 减法运算 /// </summary> /// <param name="a">整数a</param> /// <param name="b">整数b</param> /// <returns>整数</returns> public static int Sub(int a, int b) { return a - b; } /// <summary> /// 乘法运算 /// </summary> /// <param name="a">整数a</param> /// <param name="b">整数b</param> /// <returns>整数</returns> public static int Mul(int a, int b) { return a * b; } /// <summary> /// 除法运算 /// </summary> /// <param name="a">整数a</param> /// <param name="b">整数b</param> /// <returns>整数</returns> public static int Div(int a, int b) { int result = 0; if(b != 0){ result = a / b; } return result; } }}
测试结果:
0 0
- 第二十六节 深入委托实例补充
- 第二十六讲:深入委托
- 第二十五讲 实例补充
- c#中委托补充(实例学习)
- php学习 第二十六节
- 第二十六节数据库连接池
- 第二十七讲:ADO.NET实例浅析 实例补充
- 第二十六节 java学习 Vector类
- 第二十六节 UBL-USB升级
- java第二十六节-UDP编程
- 第二十六节 Scala并发编程基础
- Java基础部分第二十六节
- 第二十五讲:委托与事件实例浅析
- 委托(委托实例化)
- 第二十六讲--深入剖析事务槽及Oracle多种提交方式
- 世界杯第二十六天
- 守道第二十六
- 第二十六章 分词
- iOS学习之iOS沙盒(sandbox)机制和文件操作(二)
- Keil编译常见问题
- 【邻接表】STL中的vector实现邻接表
- UC浏览器电脑版来了:用了有快感?
- 前端面试题——js闭包
- 第二十六节 深入委托实例补充
- 我来打酱油的
- 浅析uboot网络程序结构
- 【链式前向星】(静态建邻接表)
- 【豌豆荚 & 360助手】发布第一个私人项目
- 文件上传
- 尤其是皇宫里,从上到下一个个面色凝重
- [C#]多个TrackBar控件联动设置百分比
- 自定义函数或者回调函数中调用对话框对象