上次以鸿门宴的例子写了一篇名为《分分钟用上C#中的委托和事件》的博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们。如果觉得意犹未尽,或者仍然不知如何在实际应用中使用它们,那么,这篇窗体篇,将在Winform场景中,用最简洁的方式,帮助大家真正用上C#中的委托和事件。

今天,咱们不讲场景,直接上真实的例子!

委托和事件,在Winform中最有代表性的应用,就是,一个窗体A发生某件事情的时候,其他窗体如果订阅了窗体A的某个事件,就会按照各自的方式,执行相关操作。

先上最终结果:

够简单吧。主窗体FormMain一共三个控件:btNew(Button, 新建窗体), txMsg(TextBox), btSend(Button, 发送指令);子窗体FormSub就一个有效控件:txExecute(TextBox)

要实现的功能是:在主窗体中,每单击一次“新建窗体”按钮,就会动态新建一个子窗体,子窗体的Text为"Form"+生成顺序。此功能与委托和事件无关啊。在主窗体中单击“发送指令”按钮,子窗体会接收主窗体中txMsg中的指令,并以各自的方式执行指令。为简化起见,子窗体的执行方式为,在txMsg前加上各自的生成顺序,然后显示。

就这么简单的功能,咱们就能彻底弄清楚在Winform中使用委托和事件的方法啦~

先排除干扰,在Winform工程中,拖拽生成FormMain和FormSub窗体及其控件,并编写主窗体中新建窗体按钮的点击事件,生成子窗体,并动态设置子窗体的Text属性(若这个不会,此文并不适合你,请先去看入门书籍。)此处略去若干字。。。。。。

下面将关键点:

还记得鸿门宴的例子吗?要子窗体(部下)听从主窗体(首领)的命令,应该在主窗体中按照规则写委托和事件:

  1. public delegate void SendEventHandler(string msg);
  2.  
  3. public event SendEventHandler SendEvent;

然后,在主窗体的“发送指令”按钮事件中,直接调用事件。那么,所有订阅了该事件的子窗体,都会各自执行相关操作。

当然,子窗体中需要声明一个主窗体,并在子窗体的构造函数中,需要带上主窗体作为形参,用该形参来实例化声明的主窗体(依然参考鸿门宴的例子,部下心中要有首领)

这个例子实在太简单了。下面直接上代码。对于弄懂了鸿门宴例子的朋友们,应该一看就懂。

FormMain.cs 代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8.  
  9. namespace FormEventExample
  10. {
  11. public delegate void SendEventHandler(string msg);
  12.  
  13. public partial class FormMain : Form
  14. {
  15. public event SendEventHandler SendEvent;
  16.  
  17. int num = ;
  18.  
  19. public FormMain()
  20. {
  21. InitializeComponent();
  22. }
  23.  
  24. private void btNew_Click(object sender, EventArgs e)
  25. {
  26. FormSub formSub = new FormSub(this, ++num);
  27.  
  28. formSub.Show();
  29. }
  30.  
  31. private void btSend_Click(object sender, EventArgs e)
  32. {
  33. if (this.SendEvent!=null)
  34. {
  35. this.SendEvent(txMsg.Text);
  36. }
  37. }
  38. }
  39. }

FormSub.cs 代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8.  
  9. namespace FormEventExample
  10. {
  11. public partial class FormSub : Form
  12. {
  13. FormMain formMain;
  14. int num;
  15.  
  16. public FormSub(FormMain formMain, int num)
  17. {
  18. InitializeComponent();
  19.  
  20. this.formMain = formMain;
  21.  
  22. this.num = num;
  23.  
  24. this.Text = "Form" + num;
  25.  
  26. this.formMain.SendEvent += new SendEventHandler(formMain_SendEvent);
  27. }
  28.  
  29. void formMain_SendEvent(string msg)
  30. {
  31. txExecute.Text = this.num.ToString() + ":" + msg;
  32. }
  33. }
  34. }

各个控件的拖放,见本文开头的“最终结果”,我已将控件的Name写在那三张截图中。

剩下的事情,就是大家自己领悟,触类旁通了。在较大的Winform项目中,要用好委托和事件,也不是那么容易的。有时,还需要在自定义类中用上委托和事件,作为窗体间交互的纽带。

分分钟用上C#中的委托和事件之窗体篇的更多相关文章

  1. 分分钟用上C#中的委托和事件

    每一个初学C#的程序猿,在刚刚碰到委托和事件的概念时,估计都是望而却步,茫然摸不到头脑的.百度一搜,关于概念介绍的文章大把大把的,当然也不乏深入浅出的好文章.可看完这些文章,大多数新手,估计也只是信心 ...

  2. C#中的委托和事件(下篇)

    上次以鸿门宴的例子写了一篇博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们.如果觉得意犹未尽,或者仍然不知如何在实际应用中使用它们,那么,这篇窗体篇,将在Winform场 ...

  3. C# 中的委托和事件

    觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...

  4. C# 中的委托和事件(转)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  5. C# 中的委托和事件(转载)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  6. 【转】C# 中的委托和事件

    阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...

  7. 《C#高级编程》学习笔记------C#中的委托和事件(续)

    本文转载自张子阳 目录 为什么要使用事件而不是委托变量? 为什么委托定义的返回值通常都为void? 如何让事件只允许一个客户订阅?(事件访问器) 获得多个返回值与异常处理 委托中订阅者方法超时的处理 ...

  8. c#中的委托和事件(转)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  9. C#中的委托和事件(续)

    转自张子阳的博客http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-Advanced.aspx 引言 如果你看过了 C#中 ...

随机推荐

  1. Mybatis 插入null值报错

    解决方法: 1.在settings中配置 <setting name="jdbcTypeForNull" value="OTHER"/> MyBat ...

  2. Oracle 查询库中所有表名、字段名、字段名说明,查询表的数据条数、表名、中文表名、

    查询所有表名:select t.table_name from user_tables t;查询所有字段名:select t.column_name from user_col_comments t; ...

  3. Oracle Database 11G R2 标准版 企业版 下载地址(转)

    转自:http://blog.itpub.net/628922/viewspace-759245/ 不需要注册,直接复制到迅雷或其他下载软件中即可下载. oracle 11.2.0.3 下载地址: L ...

  4. centos安装zendopcache

    由于linux用的还不熟,导致很简单的一次安装过程遇到一堆问题,还好最后安装成功了,备忘就写在这里了. zendopcache的的主要原理: PHP执行后的数据缓冲到内存中避免重复的编译,能够直接使用 ...

  5. VC++ AfxBeginThread 与 CreateThread 的区别

    简言之:AfxBeginThread是MFC的全局函数,是对CreateThread的封装.    CreateThread是Win32 API函数,前者最终要调到后者.具体说来,CreateThre ...

  6. 《Linux内核设计与实现》读书笔记 第一章 Linux内核简介

    一.相关历史 1. Unix内核的特点 简洁:仅提供系统调用并有一个非常明确的设计目的 抽象:几乎所有东西都被当做文件 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊异的移植能力 ...

  7. asp.net mvc 如何将controller 里一个action 返回值为list<>的值输出到view

    在controller中:return View(myRole.ToList());在view文件开头加上:@model IEnumerable<LTXYCallCenter.Models.Ro ...

  8. Oracle SQL优化一(常见方法)

    1.表访问方式优化: a)普通表优先“Index Lookup 索引扫描”,避免全表扫描 大多数场景下,通过“Index Lookup 索引扫描”要比“Full Table Scan (FTS) 全表 ...

  9. 创建 XMLHttpRequest 对象

    var _createHttpRequest = function () { var obj; if (window.XMLHttpRequest) obj = new XMLHttpRequest( ...

  10. OA项目之导出

    要导出页的前台: <asp:Button runat="server" ID="btnExport" Text="导出" CssCla ...