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. 删除pdf中的链接

    在Acrobat中打开pdf文件,然后:编辑→首选项→一般→自动从文本检测URL,把此处的对勾去掉,以后就不会变为食指按的形状了! 还有以下的方法 方法1:“高级(A)”→“链接(L)”→“删除文档中 ...

  2. JAVA线程通信之生产者与消费者

    package cn.test.hf.test3; import java.util.concurrent.locks.Condition;import java.util.concurrent.lo ...

  3. 前端获取后台传输过来是数据 {张三:12} 解析为[object object],获取其中内容

    昨天遇到前端传输过来的数据为[{张三:12},{李四:23}],后台用的是map格式,我在前端js中暂未找到直接调用对象内容的方法,故利用以下方法来获取: $.each(data.data,funct ...

  4. redis查找大key

    redis中查找出比较大的key 下面直接上代码 (请在测试机上测试) #!/usr/bin/env python import sys import redis def check_big_key( ...

  5. 用深度学习做命名实体识别(六)-BERT介绍

    什么是BERT? BERT,全称是Bidirectional Encoder Representations from Transformers.可以理解为一种以Transformers为主要框架的双 ...

  6. iOS渠道分包2种模式之包内注入文件分包

    解决问题:商业模式中会存在这样的形式1款app需要不同的运用团队(工会)去分包推广,谁推广的包下载的人数都会在服务器记录,不同渠道的标示唯一来区分. iOS渠道分包模式有两种 一.IDFA模式 IDF ...

  7. Knative 实战:基于 Knative Serverless 技术实现天气服务-下篇

    上一期我们介绍了如何基于 Knative Serverless 技术实现天气服务-上篇,首先我们先来回顾一下上篇介绍的内容: 通过高德天气 API 接口,每隔 3 个小时定时发送定时事件,将国内城市未 ...

  8. drf 框架

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

  9. hihoCode 1075 : 开锁魔法III

    时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅 ...

  10. [Vijos] 遭遇战

    背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...