C#winform最简单的方法就是拖控件,然后双击控件生成默认的事件。再此双击生成的只是事件的方法,事件的订阅在form.desigener.cs中,如 this.DBSelectBTN.Click += new System.EventHandler(this.DBSelectBTN_Click);。C#winform编程采用预处理机制,所谓预处理机制就是事件的发布订阅都已经处理完成,只需要使用者定义事件对应的方法即可。以button的click为例,事件发布早已经提前处理完成,即EventHandler,事件的订阅在使用者双击控件时完成(所以在通过类定义控件而不是拖动控件时,需要自己对click事件进行订阅)。而事件的触发条件就是用户对空间进行点击时,这个触发条件由C#进行监听,当点击时触发。以button为例,双击生成的方法由两个参数,如private void TestBtn_Click(object sender, EventArgs e)中的object和eventargs,其中eventargs为事件数据类,其他事件数据类继承自此类如KeyEventArgs,是C#预定义的获取键盘事务的类,即C#通过此类获取key值。

通过以下例子来模拟C#预处理事件,此例子中请忽略类的名字。

   class Program
{
/// <summary>
/// 模拟C#button click事件或者textbox 的keypress事件来更好的理解相关功能
/// C#对事件进行了预处理,在Button类的父类中定义了click事件
/// 在winform上添加事件时,其实添加的是一个方法,在form.cs中对此事件进行了订阅
/// C#对事件的发布以及触发事件的方法以及事件的订阅进行了预处理,使用者只需要完善订阅事件的方法
/// 两个参数 object sender,EventArgs e也已经进行了预处理
/// sender参数的理解:以button.click事件为例,触发事件时参数可以为click(this(或者Btn),new EventArgs()),其中Btn为Button类的一个实例
/// e参数的理解:以KeyEventArgs为例,此类继承自EventArgs类,C#通过此类获取相关输入设备的输入值;
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//模拟C#内部获取相应输入数据
string str = Console.ReadLine();
char a = str[];
KeyEventArgs e = new KeyEventArgs(a); TextBox tbx = new TextBox();
textBox1 tbx1 = new textBox1(tbx);
tbx.Run(e);
Console.WriteLine(tbx.Text);
Console.ReadKey(); }
}
/// <summary>
/// 模拟C#预处理的KeyEventArgs类
/// 此类也可以不用继承EventArgs,只是用来模拟C#,C#中事件数据类都继承自此数据基类
/// </summary>
class KeyEventArgs:EventArgs
{
private char keyChar; public KeyEventArgs(char keyChar) //来模拟C#获取键盘数据
{
this.keyChar = keyChar;
} public char KeyChar
{
get { return keyChar; }
}
}
/// <summary>
/// 模拟C#预处理的TextBox类
/// </summary>
class TextBox
{
public delegate void KeyEventHandler(object sender, KeyEventArgs e);
public event KeyEventHandler keypress;//发布事件 //模拟textbox的text属性
public string Text
{
get;set;
} //定义触发事件的方法,模拟C#内部触发事件的方法
public void Run(KeyEventArgs e)
{
if(keypress!=null)
{
keypress(this, e);//此处this为TextBox
}
}
}
/// <summary>
/// 此部分为订阅事件以及订阅事件的方法,此类中的方法为用户自己操作的部分
/// </summary>
class textBox1
{
//订阅事件
public textBox1(TextBox tbx)
{
tbx.keypress += new TextBox.KeyEventHandler(Show);
}
//订阅事件的方法
public void Show(object sender, KeyEventArgs e)
{
TextBox tb = (TextBox)sender;
tb.Text = e.KeyChar.ToString();
}
}

下面例子我们来模拟button类。

    /// <summary>
/// 模拟button类
/// </summary>
class myButton
{
//只模拟click事件
public delegate void clickEventHandler(object sender, EventArgs e);
public event clickEventHandler click;//发布click事件 //click 触发的条件
//通过此布尔值来模拟C#对鼠标单击时的事件监听,当为true时表示单击完成
public void Onclick(bool clicked)
{
EventArgs e = null;
if (clicked)
{
//if(click!=null)
//{
// click(this, e);
//}
click?.Invoke(this, e); }
}
}
class Program
{
static void Main(string[] args)
{
myButton button1 = new myButton();
button1.click += new myButton.clickEventHandler(button1_click);//委托为静态的,必须用类名引用 EventArgs e=null;
bool clicked = true;//表示进行单击
button1.Onclick(clicked);
Console.ReadKey();
} //----------------------------------------------------//
//此方法的名字纯粹是为了模拟双击控件时默认的方法名字
static void button1_click(object sender,EventArgs e)
{
Console.WriteLine("这是单击时触发的方法");
}
}

虚线一上部分即为C#为我们处理好 的部分,我们只需要拖动控件,生成button_click方法。

这是C#的预处理事件机制。简单模拟一下。

winform事件的更多相关文章

  1. 浅谈Winform事件的实现以及模拟其事件的实现(附实现源码)

    当我们初学Winform的时候被其神奇的事件功能所吸引,当点击一个按钮时,便会跳到我们所写的点击方法当中去.然而这并不符合我们对方法的理解,究竟.net在后面帮助我们实现了什么.我们怎样模拟其事件的实 ...

  2. WinForm事件与消息

    WinForm事件与消息 消息概述以及在C#下的封装 Windows下应用程序的执行是通过消息驱动的.所有的外部事件,如键盘输入.鼠标移动.按动鼠标都由OS系统转换成相应的"消息" ...

  3. WinForm事件中的Object sender和EventArgs e参数

    Windows程序有一个事件机制.用于处理用户事件. 在WinForm中我们经常需要给控件添加事件.例如给一个Button按钮添加一个Click点击事件.给TextBox文本框添加一个KeyPress ...

  4. Visual Studio2013应用笔记---WinForm事件中的Object sender和EventArgs e参数

    Windows程序有一个事件机制.用于处理用户事件. 在WinForm中我们经常需要给控件添加事件.例如给一个Button按钮添加一个Click点击事件.给TextBox文本框添加一个KeyPress ...

  5. Winform 事件

    事件参数:object sender - 事件主体EventArgs e - 事件数据函数体 - 我进行的操作 常用事件:点击事件click (1)Load事件:该事件在窗体加载到内存时发生,即在第一 ...

  6. WebBrowser中html元素如何触发winform事件

    这个问题来自论坛提问,对dom稍微了解的话还是比较简单的,只要注册一下事件就可以了. C#代码如下: using System;using System.ComponentModel;using Sy ...

  7. WinForm 生命周期, WinForm 事件执行顺序

    1.窗体启动: Control.HandleCreatedControl.BindingContextChangedForm.LoadControl.VisibleChangedForm.Activa ...

  8. WebBrowser中html元素如何触发winform事件 z

    只要注册一下事件就可以了. C#代码如下: using System;using System.ComponentModel;using System.Windows.Forms; namespace ...

  9. 用winform程序来了解委托和事件

    一.浅谈委托 如果有个过winform 和webform 程序开发的小伙伴一定有个这样的感觉吧,点击Button直接就执行了那个方法,到此他是怎么实现了的呢,大家有考虑过没有? 回到正题,什么是委托呢 ...

随机推荐

  1. 怎样用手机把视频变成GIF表情包?原来那么简单,网友:看完涨知识了

    现如今表情包几乎成了,我们手机聊天的必需品了.不过相比于普通表情包,大家更喜欢用GIF表情包,因为动图表情包不仅更加搞笑,而且能更形象的表达我们的情绪.比较有想法的朋友甚至想自己制作GIF表情包,但是 ...

  2. centos 升级

    yum -y update升级所有包同时也升级软件和系统内核 yum -y upgrade只升级所有包,不升级软件和系统内核

  3. python习题作业合集(持续更新……)

    作业: 1.简述位,字节关系 2.请写出“天才”分别用utf-8和gbk编码所占位数 3.如果有一个变量num = 14,请使用int的方法,得到改变量最少可以用多少个二进制位表示 4.写代码,有如下 ...

  4. mapper操作数据的同时返回操作后的值

    <insert id="insertSelective" parameterType="com.test.entity.business" keyProp ...

  5. java获取配置文件中的key=value值

    1.献上工具类 package com.test.util; import java.io.FileInputStream; import java.io.FileNotFoundException; ...

  6. uC/OS-III 时间管理(二)

    时间管理就是一种建立在时钟节拍上,对操作系统任务的运行实现时间上管理的一种系统内核机制. 常用以下五个函数: OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() ...

  7. .Net Core自动化部署系列(一):Jenkins + GitLab

    项目进行微服化改造后系统发布就变得愈为重要,因为持续集成导致部署变得越来越频繁,人工部署带来的一些问题日渐凸显,大家可能都有被系统部署线问题困扰过的经历. 本篇我们将会使用Jenkins+Gitlab ...

  8. drf 框架

    一. drf简介 drf框架,全程: django-rest framework  ,   rest是插件名字,django插件的名字叫rest,framework是框架的意思 二. 接口 在平时生活 ...

  9. springboot结合mybatis

    idea中新建springboot项目 pom.xml依赖部分如下 <dependencies> <dependency> <groupId>org.springf ...

  10. mobaxterm和CRT的文件上传

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/submarineas/article/de ...