winform事件
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事件的更多相关文章
- 浅谈Winform事件的实现以及模拟其事件的实现(附实现源码)
当我们初学Winform的时候被其神奇的事件功能所吸引,当点击一个按钮时,便会跳到我们所写的点击方法当中去.然而这并不符合我们对方法的理解,究竟.net在后面帮助我们实现了什么.我们怎样模拟其事件的实 ...
- WinForm事件与消息
WinForm事件与消息 消息概述以及在C#下的封装 Windows下应用程序的执行是通过消息驱动的.所有的外部事件,如键盘输入.鼠标移动.按动鼠标都由OS系统转换成相应的"消息" ...
- WinForm事件中的Object sender和EventArgs e参数
Windows程序有一个事件机制.用于处理用户事件. 在WinForm中我们经常需要给控件添加事件.例如给一个Button按钮添加一个Click点击事件.给TextBox文本框添加一个KeyPress ...
- Visual Studio2013应用笔记---WinForm事件中的Object sender和EventArgs e参数
Windows程序有一个事件机制.用于处理用户事件. 在WinForm中我们经常需要给控件添加事件.例如给一个Button按钮添加一个Click点击事件.给TextBox文本框添加一个KeyPress ...
- Winform 事件
事件参数:object sender - 事件主体EventArgs e - 事件数据函数体 - 我进行的操作 常用事件:点击事件click (1)Load事件:该事件在窗体加载到内存时发生,即在第一 ...
- WebBrowser中html元素如何触发winform事件
这个问题来自论坛提问,对dom稍微了解的话还是比较简单的,只要注册一下事件就可以了. C#代码如下: using System;using System.ComponentModel;using Sy ...
- WinForm 生命周期, WinForm 事件执行顺序
1.窗体启动: Control.HandleCreatedControl.BindingContextChangedForm.LoadControl.VisibleChangedForm.Activa ...
- WebBrowser中html元素如何触发winform事件 z
只要注册一下事件就可以了. C#代码如下: using System;using System.ComponentModel;using System.Windows.Forms; namespace ...
- 用winform程序来了解委托和事件
一.浅谈委托 如果有个过winform 和webform 程序开发的小伙伴一定有个这样的感觉吧,点击Button直接就执行了那个方法,到此他是怎么实现了的呢,大家有考虑过没有? 回到正题,什么是委托呢 ...
随机推荐
- [python]OS文件系统
1.getcwdd() 获得应用程序当前的工作目录 #getcwd() 获取应用程序当前的工作目录 import os print(os.getcwd()) 2.chdir(path) 改变当前工作目 ...
- python 数据分析师
简介 越来越多的政府机关.企事业单位将选择拥有数据分析师资质的专业人士为他们的项目做出科学.合理的分析.以便正确决策:越来越多的风险投资机构把数据分析师所出具的数据分析报告作为其判断项目是否可行及是否 ...
- FIT文件CRC校验
校验FIT文件CRC代码做个记录,分为两步先校验头部然后再校验整个FIT文件.校验头部不是必需的看个人需要吧.为了偷懒使用Okio库,还有计算CRC的时候用的Garmin的FitSDK. public ...
- mysql 事物四大特性和事物的四个隔离
1.事物四大特性(ACID) 原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部 ...
- 多tomcat服务和nginx负载均衡配置
1.nginx服务安装及配置,详见:linux 配置之安装nginx 2.多个tomcat服务安装及配置,详见:linux 配置多个tomcat 3.关键配置nginx.conf文件 http { i ...
- 【ADO.NET基础知识】SqlConnection、command、DataSet 、DataTable、dataAdapter
1.使用Connection连接数据库的步骤: (1).添加命名空间 System.Data.SqlClient(注意:初学者经常会忘记) (2)定义连接字符串.连接SQL Server 数据库时: ...
- ThinkPHP5 支付宝 电脑与手机支付扩展库
ThinkPHP5 电脑与手机支付扩展库(2017年9月18日) 使用说明 在默认配置情况下,将文件夹拷贝到根目录即可, 其中extend目录为支付扩展目录, application\extra\al ...
- pyinstaller 打包exe程序读不到配置文件No such file
挺久没更新博客的,一来之前是觉得才疏学浅,记录下来的太简单没人看.二来时间上不是很充裕(不是借口,有时间打游戏,没时间总结) 偶然有一次发现同事在搜索解决问题的时候正在看我博客的解决思路,很奇妙的感觉 ...
- scalikejdbc 学习笔记(3)
重用connection: package com.citi.scalikejdbc import scalikejdbc._ import scalikejdbc.config._ object C ...
- Python_散点图与折线图绘制
在数据分析的过程中,经常需要将数据可视化,目前常使用的:散点图 折线图 需要import的外部包 一个是绘图 一个是字体导入 import matplotlib.pyplot as plt fro ...