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. 基于Linux系统--web环境搭建

    上线部署文档 数据库部分1.下载Mysql服务    #yum  install  mysql-server 2.更改             /etc/my.cnf 3.启动Mysql        ...

  2. Python学习笔记整理总结【MySQL】

    一. 数据库介绍 1.什么是数据库?数据库(Database)是按照数据结构来组织.存储和管理数据的仓库.每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将 ...

  3. 23种设计模式之原型模式(Prototype Pattern)

    原型模式 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 分析: 孙悟空:根据自己的形状复制(克隆)出多个身外身 软件开发:通过复制一个原型对象得到多个与原型对象一模一样的新对象 ...

  4. Maven 梳理 - 常用三种archetype说明

    archetype:原型的意思,可理解为Maven项目模板工具包 常用archetype 1.cocoon-22-archetype-webapp 2.maven-archetype-quicksta ...

  5. Spring 梳理 -异常处理

    Spring 提供了多种方式将异常转换为相应 Spring框架提供的通用异常,将异常转换为HTTP状态码 Spring默认会将自身抛出的异常自动映射到合适的状态码,如下是一些示例: 举个例子,当后端抛 ...

  6. thymeleaf 设置display样式

    使用th:style标签: th:style="'display:' + @{(${value} ? 'none' : 'inline-block')} + ''" 其中value ...

  7. rpm,yum

    rpm RedHat Package Manager软件包管理器的核心功能:1.制作软件包2.安装.卸载.升级.查询.校验.数据库的重建.验证数据包等工作 安装: rpm -i    /PATH/TO ...

  8. 移动端适配 rem 设置

    refresh();    window.onresize = function(){      setTimeout(function(){        refresh();      },10) ...

  9. ARP攻击原理简析及防御措施

    0x1  简介 网络欺骗攻击作为一种非常专业化的攻击手段,给网络安全管理者,带来严峻的考验.网络安全的战场已经从互联网蔓延到用户内部的网络, 特别是局域网.目前利用ARP欺骗的木马病毒在局域网中广泛传 ...

  10. Thinkphp5.0终章

    thinkphp5.0最终总结 前期刚开始我是跟着b站上的千峰教育的视频走的,一路上做笔记进行深化与实际操作,中间因为不会开报错,并且视频里面也没有讲到怎么弄报错,因为是新手,那种出错了却不知道错在哪 ...