• (论坛答疑点滴)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例》【全面避坑+最佳实践=健壮代码】
  • 相关阅读:
    我的操作系统复习——进程(下)
    我的操作系统复习——进程(上)
    我的操作系统复习——操作系统概述
    GO语言总结(5)——类型转换和类型断言
    GO语言总结(4)——映射(Map)
    GO语言总结(3)——数组和切片
    GO语言总结(2)——基本类型
    msl字符串截取与拆分
    ES中模糊查询的实现
    mysql纯数字的字符串排序
  • 原文地址:https://www.cnblogs.com/lovecherry/p/173668.html
Copyright © 2020-2023  润新知