收藏 分销(赏)

程序运行中添加控件并对控件操作.doc

上传人:pc****0 文档编号:7782191 上传时间:2025-01-16 格式:DOC 页数:10 大小:38KB
下载 相关 举报
程序运行中添加控件并对控件操作.doc_第1页
第1页 / 共10页
程序运行中添加控件并对控件操作.doc_第2页
第2页 / 共10页
点击查看更多>>
资源描述
我们可以看到如下代码: this.button1.Click += new System.EventHandler(this.button1_Click); 实际上这段代码,也就是所谓的事件注册代码。该代码的意思是:如果this.button1的Click事件发生之后,就转向this. button1_Click方法进行处理。 为了更好的理解事件的注册过程,我们先第42行代码进行修改,如下图所示: 这里,我们将原来的 this.button1.Click += new System.EventHandler(this.button1_Click); 修改为 this.button1.Click = new System.EventHandler(this.button1_Click); 在这个程序里,这里的修改是为了更好理解,当然这种写法是语法错误的。 下面我们对其进行分析: 首先,观察“=”右面的表达式。 new System.EventHandler(this.button1_Click); 通过6.1.1一节中的说明,大家可以发现,这段代码实际上是建立了一个委托类型的实例,并让该委托指向了this.button1_Click方法。也就是说,在程序运行的“某一时刻”,系统会通过这个委托实例间接的调用this.button1_Click方法。 然后,我们再来观察“=”左面的表达示。在C风格的语言中“=”是赋值表达式,也就是说,“=”两侧表达式的数据类型应该是一样的。因此,既然“=”右侧的表达式是一个委托类型(System.EventHandler)的实例,那么this.button1.Click也应该是一个委托类型(System.EventHandler)。 通过上面的说明,我们得到一个信息,前面这段事件注册代码,是让this.button1.Click和System.EventHandler(this.button1_Click)指向了同一段内存空间,简单来讲,就是让this.button1.Click指向了this.button1_Click方法,调用了this.button1.Click,就相当于调用了this.button1_Click方法。因此,我们说,当this.button1的Click事件发生之后,方法this.button1_Click就会被调用。 在程序运行的时候,系统会自己检测this.button1是否被点击了,如果被点击了,就在button1的内部调用button1.Click,这时,Windows窗口中的button1_Click方法就会被执行。 当然,事件注册代码完全可以手写。因为,除了控件中事件注册代码是自动生成以外,其他类中的事件注册都是手写的。手工注册事件的方法如下: 首先,可以在事件发生之前的任何代码中添加事件(通常是在窗口的构造方法中),下面我们来手工注册button1的MouseMove事件,如下图所示: 当我们写完“=”时,会出现一个提示“Press TAB to insert”,这时,我们只需要按2下“TAB”键,事件的注册以及用于回调的方法,就会自己添加到代码窗口里,如下图所示: 自动生成的代码是将this.button1的MouseMove事件指向了button1_MouseMove方法。这样手写的代码和IDE自动生成的代码是完全一样的。 当然,作为控件的事件,我们完全可以自动生成,如果想自动生成button1的其他事件,只需要查看button1的属性窗口,并点击“”按钮,就会出现该控件的事件列表,如下图所示: 然后双击你想要的事件,代码就会自动生成了。 在前的面代码中为了更好理解事件注册,我们曾将 this.button1.Click += new System.EventHandler(this.button1_Click); 修改为 this.button1.Click = new System.EventHandler(this.button1_Click); 我们会发现,无论是自己写的事件注册代码,还是自动生成的代码,都是使用“+=”来实现的,实际上,作为事件注册的代码,我们仅仅能够使用“+=”来实现注册,简单的使用“=”是语法错误的!!! “+=”操作符在C风格语言中是常用的操作符,比如 int i=0; i+=1; 等同于 int i=0; i=i+1; 因此, this.button1.Click += new System.EventHandler(this.button1_Click); 在原则上等同于 this.button1.Click = this.button1.Click + new System.EventHandler(this.button1_Click); 用自然语言来描述上面的代码就是“一个委托=这个委托本身+另外一个委托”。那么委托相加意味着什么呢? 在6.1.3一节中,我们讨论过MultiDelegate(多播委托),而事件本身也是委托,并且所有委托都是System.MultiDelegate类的派生类,在6.1.3中,我们曾经演示过,多个委托类型实例相加,就是将这些委托实例存放在一个多播委托的调用链中,当调用多播委托时,该多播委托的调用链中的所有委托都会顺序的被调用。 利用多播委托的原理,我们可以将多个方法注册给一个事件,如下所示: this.button1.Click +=new System.EventHandler(this.button1_Click); this.button1.Click +=new System.EventHandler(this.button1_Click1); this.button1.Click +=new System.EventHandler(this.button1_Click2); 上面的代码,就将三个方法注册到了button1的Click事件中,当button1的Click事件触发之后,方法button1_Click,button1_Click1,button1_Click2将会被顺序调用。这样作的好处是,我们可以将多个功能以及逻辑完全独立的操作放在不同的方法中,当事件发生之后,这些方法将会顺序的被调用,以实现我的需要的级联操作。 6.2.3 控件中事件的回调方法 说完了事件的注册,下面我们来谈一下事件的回调方法。首先,我们还要再一次回顾事件注册的代码: this.button1.Click +=new System.EventHandler(this.button1_Click); 上面代码中,使用“new System.EventHandler(this.button1_Click)”将一个System.EventHandler委托类型的实例指向了this.button1_Click方法。通过6.1.1一节中所谈到的内容,我们知道,如果想让一个委托指向一个方法,那么该委托以及所被指向的方法一定要具备相同的签名(Signature,具备相同的参数列表,相同的返回值)。因此,System.EventHandler类型和this.button1_Click方法具备相同的签名,下面,我们来看一下System.EventHandler委托的签名是什么样的: public delegate void EventHandler(               Object sender,               EventArgs e ) System.EventHandler的签名是:返回值为void;有两个参数,Object sender, EventArgs e。因此button1_Click方法也具备相同形式,代码如下: private void button1_Click(object sender, EventArgs e) { } 实际上,我们所能够看到的事件回调方法的签名基本上都着不多,只不过第二个参数略有区别,下面,我们对该方法的参数进行说明。 Ø         Object sender 从该参数的命名上,可以看出其作用,sender(发送者)的意思是:谁触发的这个事件,那么sender就是谁,由于所有的类型在理论上讲都可以包括事件,因此sender的类型被定义成Object类型,当多个事件同时指向一个事件回调方法的时候,通过该参数可以区分出是哪一个类触发的事件,以便做出不同的处理,此时,需要对参数sender作出类型转化。 l         案例操作020603:多个事件指向同一个回调方法 首先,添加三个Button,一个TextBox 界面如下: 然后,在主窗口中添加一个方法ButtonClick,这三个按钮的Click事件将调用该方法。 代码如下: protected void ButtonClick(object sender, EventArgs e) {      Button bt = sender as Button;      this.textBox1.Text ="我是:"+ bt.Text; } 上面代码中,为了知道点击的是哪个按钮,我们将sender转化成了Button类型。 下面来指定这三个按钮的Click事件回调方法 首先,切换到button1的属性窗口(F4),点击“”按钮,找到“Click”事件,并设置所调用的方法名为ButtonClick ,如下图所示。 然后,以相同的方法设置button2,button3的Click事件,并它们都指向ButtonClick方法。 最后,运行程序,下面是运行情况: 点击button1: shenqiboy private int count;//用于计数,添加了多少个按钮 private void btn_addButtons_Click(object sender, System.EventArgs e)         {             // 计数,计算目前是添加的几个按钮             count++;             // 计算待添加按钮的位置             int localY = this.btn_addButtons.Height * count;             int localX = 10 * count;             Button toAddButton = new Button();             // 设置待添加按钮的属性             toAddButton.Name="Button " + count;             toAddButton.Text=" 按钮" + count + " ";             toAddButton.Location= new Point(localX, localY);             // 设置待添加按钮的事件             // MouseEnter当鼠标指针进入控件时             // MouseLeave当鼠标指针离开控件时             toAddButton.MouseEnter += new System.EventHandler(this.btn_MouseEnter);             toAddButton.MouseLeave += new System.EventHandler(this.btn_MouseLeave);             toAddButton.Click += new System.EventHandler(this.btn_Click);             // 把控件添加到窗口中             this.Controls.Add(toAddButton);         }         private void btn_MouseEnter(object sender, System.EventArgs e)         {             // unboxing             Button currentButton = (Button)sender;             // 设置鼠标的背景颜色             currentButton.BackColor = Color.Blue;         }         private void btn_MouseLeave(object sender, System.EventArgs e)         {             //unboxing             Button currentButton = (Button)sender;             // 设置鼠标的背景颜色             currentButton.BackColor = System.Windows.Forms.Control.DefaultBackColor;         }         private void btn_Click(object sender, System.EventArgs e)         {             // unboxing             Button currentButton = (Button)sender;             // 显示点击了哪个按钮             txt_msg.Text = "你点击了" + currentButton.Text;         }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服