zoukankan      html  css  js  c++  java
  • 分分钟用上C#中的委托和事件之窗体篇

    上次以鸿门宴的例子写了一篇名为《分分钟用上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属性(若这个不会,此文并不适合你,请先去看入门书籍。)此处略去若干字。。。。。。

    下面将关键点:

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

    public delegate void SendEventHandler(string msg);
    
    public event SendEventHandler SendEvent;

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

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

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

    FormMain.cs 代码如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace FormEventExample
    {
        public delegate void SendEventHandler(string msg);
    
        public partial class FormMain : Form
        {
            public event SendEventHandler SendEvent;
    
            int num = 0;
    
            public FormMain()
            {
                InitializeComponent();
            }
    
            private void btNew_Click(object sender, EventArgs e)
            {
                FormSub formSub = new FormSub(this, ++num);
    
                formSub.Show();
            }
    
            private void btSend_Click(object sender, EventArgs e)
            {
                if (this.SendEvent!=null)
                {
                    this.SendEvent(txMsg.Text);
                }
            }
        }
    }

    FormSub.cs 代码如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace FormEventExample
    {
        public partial class FormSub : Form
        {
            FormMain formMain;
            int num;
    
            public FormSub(FormMain formMain, int num)
            {
                InitializeComponent();
    
                this.formMain = formMain;
    
                this.num = num;
    
                this.Text = "Form" + num;
    
                this.formMain.SendEvent += new SendEventHandler(formMain_SendEvent);
            }
    
            void formMain_SendEvent(string msg)
            {
                txExecute.Text = this.num.ToString() + ":" + msg;
            }
        }
    }

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

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

  • 相关阅读:
    HDU 4165 pills
    POJ 2125 Destroy The Graph
    POJ 2075 Tangled in Cables
    NYOJ Number SequenceProblem F
    PHP Eval研究笔记
    PHP 学习备忘(更新中)
    iOS学习笔记1 版本控制
    PHP全局缓存上栽的坑及其他【反面教材系列】
    iOS学习笔记2 Code Format
    iOS学习笔记4 垃圾回收初涉
  • 原文地址:https://www.cnblogs.com/yinqixin/p/5067033.html
Copyright © 2011-2022 走看看