C#事件处理程序的写法

事件的概念

原则:

1、C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器;

2、发送器不知道接收器的任何情况,但接收器有一个事件处理程序来处理这个事件(当事件发生时);那么发送器和接收器之间如何进行通信呢?用事件,用委托,简单地来理解把事件理解成消息即可。

先定义个委托,要使用的事件处理程序的签名(也就是函数类型,返回值,参数个数,参数类型等等)由这个委托定义,委托本质就是个函数指针,指向指令所在的内存区域。

      

      事件+=委托(事件处理程序)

      把这个事件委托给了事件处理程序

      至于事件处理程序的签名是怎么样的,由委托给出,EventHandler委托是由系统所定义的。

 

      所以总的流程,是这样的:

      1)先定义个委托,不一定在接收器的内部,在可见域即可

      2)在发送器类对象的内部来进行注册,进行委托,把事件和事件处理程序关联起来(事件处理程序可以是静态的,直接用;可以是非静态的,用实例化对象才能调用,因为这种成员函数是属于类实例对象的,只有实例化的对象调用才有意义,也可以理解成为,实例化对象之后才编译出这种函数的指令代码放在内存中,才能有效引用,这种是否和静态函数一样是否预先编译取决于编译器及系统的综合考量设计),在接收器方面,给出事件处理程序的实现。

 

3、

 

 

4、可给一个事件添加多个事件处理程序,仍类似于多播委托,多个事件处理程序的顺序是不一定的,所以就不能编写事件处理程序之间互相有顺序依赖的程序

 

 5、一种简化写法,不必给出事件处理程序(消息处理函数),在事件委托给事件处理程序处,直接用入表达式给出事件处理程序的代码块

 

 6、

 

事件定义的时候,其语法形式需要指出所用的委托(一种类类型,一种函数指针的类型,带有签名检查,返回值,参数类型,参数个数等等),一般使用系统内置的委托,所以就不用单独给出了;

委托的参数用的是规定好的形式,void返回类型,两个参数,一个参数object sender,一个参数是有关事件的其他有用信息的类对象,可以是任意类类型,但是必须派生于EventArgs类(派生于的一个基类,为了多态扩展,可以使用任何未知类型,用一定义好的函数格式)

在接收器,给出满足这个委托格式(这个事件处理函数格式)的函数,也就是事件处理程序的实现即可。


原则:

1、sender是一个object定义类型,利用oo多态的功能,
父类引用一个子类实例化对象完全可以,在执行的时候
解析成个子类的对象,当然要调用子类扩展的成员时
直接用sender不行,因为毕竟在形式上是父类类型,父类里面
没有这样的成员,虽然它在实际上是一个子类的对象,这时候,
强制类型转化,当子类用(实际在内存就是,当然安全)

 

 

事件为空的情况

原则:

1、如果没有为事件写好事件处理程序,那么事件(也是个类,类对象)为空

 

 

2、前面所述的

事件+=委托(事件处理程序)

这种语法格式的语句,只是把事件和事件处理程序关联了起来,并且在这个时候,事件处理程序已经是肯定定义了,因为传入了事件处理程序的称,也就是说指明了事件发生时用哪个函数,这同时说明,这种关联是写在事件接收器的(一般用户编写代码都是在事件接收器,比如系统事件都是由系统发出的,在接收方关联到自定义的事件处理程序来实现各种功能应用);

 

事件的引发是在事件发送器端,一般用以下代码实现

 

if(eventObject != null)

{

    eventObject(sender, ev);

}

 

在定义了事件处理程序的时候,eventObject就不是null了,这时候,用eventObject(sender, ev);语句引发事件,相当于C中的sendmessage作用


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#,文本框输入后立即触发事件的方法有多种。其一种方法是使用TextChanged事件。当文本框的内容发生变化时,TextChanged事件会被触发。你可以在事件处理程序编写代码来响应文本框内容的变化。例如,在窗体Form1,你可以为textBox1绑定TextChanged事件,然后在事件处理程序执行你想要的操作。以下是一个示例代码: private void textBox1_TextChanged(object sender, EventArgs e) { // 在这里编写你的代码,响应文本框内容的变化 // 例如,你可以调用RefreshTextBox方法来刷新Form2的文本框内容 RefreshTextBox(textBox1.Text); } 在上述代码,当textBox1的内容发生变化时,TextChanged事件会被触发,然后调用RefreshTextBox方法来刷新Form2的文本框内容。请注意,RefreshTextBox方法需要在Form2定义,并且必须是public的,以便在Form1访问。你可以参考引用\[1\]的代码来实现RefreshTextBox方法。 另外,还有其他一些事件可以用于监听文本框输入的变化,如KeyUp、KeyPress和KeyDown事件。这些事件在不同的情况下有不同的触发时机和特点。例如,KeyUp事件会在按键释放时触发,而KeyPress事件会在按键按下时触发。你可以根据你的需求选择适合的事件来监听文本框输入的变化。你可以参考引用\[2\]和引用\[3\]的代码来了解如何使用这些事件。 总之,你可以使用TextChanged事件或其他适合的事件来实现在文本框输入后立即触发事件的功能。希望这些信息对你有帮助! #### 引用[.reference_title] - *1* *2* [文本框内容自动投影,浅谈C#事件写法与应用](https://blog.csdn.net/ylq1045/article/details/127034812)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C#文本框KeyPress事件触发回车事件调用相关函数。](https://blog.csdn.net/qq_35604488/article/details/107222214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值