代码之家  ›  专栏  ›  技术社区  ›  T.Todua Laurent W.

如何将事件合并到一个方法中?

c#
  •  0
  • T.Todua Laurent W.  · 技术社区  · 8 年前

    默认情况下,我们以以下方式添加事件:

    item1.Click += Click1;
    item2.Click += Click2;
    
    .....
    private void Click1(){
        .....
    }
    private void  Click2(){
    }
    

    但是,是否有一种方法可以将其组合成一种方法,例如:

    item1.Click += Click(1);
    item2.Click += Click(2);
    ....
    private void Click(int num){
      if(num==1){
         ....
      }
      else if(num==2){
         ....
      }
    }
    

    (顺便说一句,C中的新手)

    3 回复  |  直到 8 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    8 年前

    事件处理程序具有 sender 通常可用于标识实际发件人的参数:

    void Click(object sender, EventArgs e)
    {
        var btn= (Button)sender; // you can access properties which you might have set to identify which button it is 
        .....
    }
    
    button1.Click+=Click;
    button2.Click+=Click;
    button3.Click+=Click;
    button4.Click+=Click;
    

    如果这还不够,并且您想向处理程序传递一些额外的数据,您可以使用lambda:

    void Click(object sender, EventArgs e, int extraInfo)
    {
        var btn= (Button)sender;
        .....
    }
    
    button1.Click+=(s, e) => Click(s, e, 1);
    button2.Click+=(s, e) => Click(s, e, 2);
    button3.Click+=(s, e) => Click(s, e, 3);
    button4.Click+=(s, e) => Click(s, e, 4);
    

    取消订阅对于匿名方法来说是一个问题,但是如果处理程序所有者和控件在一个页面中具有相同的生命周期,那么这可能无关紧要,因为它们无论如何都会一起进行GC ed

        2
  •  1
  •   Slai    8 年前

    您还可以通过引用比较发件人:

    item1.Click += Click;
    item2.Click += Click;
    ....
    void Click(object sender, EventArgs e)
    {
        Control c = sender as Control;     // c = null if sender is not Control
    
        if (sender == item1)
            Debug.Print(c.Name + ", " + c.Text + ", " + c.Tag);
        else if (sender == item2)
            Debug.Print(c.Name + ", " + c.Text + ", " + c.Tag);
    }
    
        3
  •  0
  •   Panagiotis Kanavos    8 年前

    事情总是这样。只要签名相同,就可以对多个事件使用相同的事件处理程序。基地 EventHandler 类型接受a sender 哪个是 火灾 事件和 EventArgs -派生参数,该参数在代码触发事件时出现。

    例如,可以为多个按钮提供一个单击处理程序:

    void myHandler(object sender,EventArgs e)
    {
        var theButton=(Button)sender;
        .....
    }
    
    button1.Click+=myHandler;
    button2.Click+=myHandler;
    button3.Click+=myHandler;
    button4.Click+=myHandler;
    

    假设您想创建一个10位数的计算器。您可以读取发件人的文本或标记属性以检索数字:

    void myDigitsHandler(object sender,EventArgs e)
    {
        var theButton=(Button)sender;
        //You could store a number to the tag
        int digitFromTag=(int)theButton.Tag;
    
        //Or you could parse the text
        int digitFromText=int.Parse(theButton.Text);
        .....
    }