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例》【全面避坑+最佳实践=健壮代码】
  • 相关阅读:
    MySQL数据库服务器的架设
    Ubuntu 16.04 LTS软件包管理基本操作
    2个 List<T>进行数据合并
    创建 cachingConfiguration 的配置节处理程序时出错: 未能加载文件或
    【转】.gitignore失效的解决办法
    【转】码农提高工作效率
    【转】从零开始编写自己的C#框架(7)——需求分析
    C#获取文件的绝对路径
    【转】类中如何引用server.MapPath()
    c# 运行时替换某文件源代码(将XML 转换成 某个枚举并写入源文件)
  • 原文地址:https://www.cnblogs.com/lovecherry/p/173668.html
Copyright © 2011-2022 走看看