zoukankan      html  css  js  c++  java
  • (论坛答疑点滴)winform下怎么得到按钮的click事件的处理方法

    我们在做应用程序的时候有时候想知道页面上的按钮对于某一事件委托链上有多少方法,下面是一个例子。

    1、先添加3个按钮,分别添加0个,1个,2个click事件的方法,按钮名字分别为button1,button2,button3。

    this.button2.Click += new System.EventHandler(this.button2_Click);
    this.button3.Click += new System.EventHandler(this.button3_Click1);
    this.button3.Click += new System.EventHandler(this.button3_Click2);

    2、方法里面可以随便写点代码:

        private void button2_Click(object sender, System.EventArgs e)
            {
                MessageBox.Show(
    "button2_Click");
            }

            
    private void button3_Click1(object sender, System.EventArgs e)
            {        
                MessageBox.Show(
    "button3_Click1");
            }

            
    private void button3_Click2(object sender, System.EventArgs e)
            {
                MessageBox.Show(
    "button3_Click2");        
            }

    3、再放一个textbox(textbox1)用来填写按钮的名字,一个listbox(listbox1)显示按钮的click事件处理方法,最后放置一个按钮,点击这个按钮显示textbox1填写的那个按钮的click事件的处理方法于listbox1上,代码如下:

    if(this.textBox1.Text=="")
                    MessageBox.Show(
    "填写一个按钮的id");
                
    else
                {
                    Button btn
    =null;
                    
    foreach(Control c in this.Controls)
                        
    if(c.Name==this.textBox1.Text)
                            btn
    =(Button)c;
                    
    this.listBox1.Items.Clear();
                    PropertyInfo pi
    =(typeof(Button)).GetProperty("Events",BindingFlags.Instance|BindingFlags.NonPublic);
                    EventHandlerList ehl
    =(EventHandlerList)pi.GetValue(btn,null);
                    FieldInfo fi
    =(typeof(Control)).GetField("EventClick",BindingFlags.Static|BindingFlags.NonPublic);
                    Delegate d
    =ehl[fi.GetValue(null)];
                    
    if(d!=null)                
                    {
                        
    foreach(Delegate de in d.GetInvocationList())
                            
    this.listBox1.Items.Add(de.Method.Name);
                    }
                    
    else
                    {
                        
    this.listBox1.Items.Add("没有任何处理方法");
                    }
                }

    别忘记
    using System.Reflection;

    为何如此复杂?是因为这些控件的事件都封装到了EventHandlerList内,而它不是公共成员,因此还需要通过反射来剥离出来。


    欢迎大家阅读我的极客时间专栏《Java业务开发常见错误100例》【全面避坑+最佳实践=健壮代码】
  • 相关阅读:
    10 种保护 Spring Boot 应用的绝佳方法
    Redis 如何分析慢查询操作?
    Spring Boot 主类及目录结构介绍
    Redis 再牛逼,也得设置密码!!
    Spring Data Redis 详解及实战一文搞定
    Spring Boot Redis Cluster 实战干货
    超详细的 Redis Cluster 官方集群搭建指南
    Redis Linux 安装运行实战全记录
    hdu 4790 Just Random (思路+分类计算+数学)
    poj 1328 Radar Installation(贪心)
  • 原文地址:https://www.cnblogs.com/lovecherry/p/173668.html
Copyright © 2011-2022 走看看