我定义了一个void write_Click
代码如下
 public void write_Click(string str1,string str2,string str3,string a)
{
}
我想给按钮添加一个这个函数的触发事件
如下
b[i].Click += new EventHandler(write_Click(str1, str2, str3, a));
其中三个参数值已定义,但是总是提示我要输入方法名称……
求解释 ,谢谢了。

解决方案 »

  1.   

    只要名称,不要参数
    b[i].Click += new EventHandler(write_Click)
    即可,如果参数是必须的,也不要在这里增加,事件会产生sender对象,由对象不同再传递不同参数,
    或者像委托那样传参可以试下,外出没环境,如有需要迟些补上。
      

  2.   

    我试了删除参数,但是提醒我
    错误 1 “write_Click”的重载均与委托“System.EventHandler”不匹配 C:\Users\mc\Documents\Visual Studio 2010\Projects\TRY1\TRY1\Form3.cs 500 43 TRY1
    求指导……
      

  3.   

    b.Click += new EventHandler(write_Click);
    这里只是把事件处理程序和事件关联起来。事件是由button1按钮内部触发的。因此,即便有办法定义“参数”,你除非能改变系统调用事件的代码(这些被封装在system.forms.dll里面),否则,也没有办法传递这些参数。
      

  4.   


    public void write_Click(object sender, EventArgs e) {
        MyEventArgs myEventArgs = e as MyEventArgs;
        string str1 = myEventArgs.str1;
        string str2 = myEventArgs.str2;
        string str3 = myEventArgs.str3;
        // 其他代码。。
    }class MyEventArgs : EventArgs {
        public string str1 { get; set; }
        public string str2 { get; set; }
        public string str3 { get; set; }
    }
      

  5.   

    对不起,刚刚上厕所的时候想起来,这种方式好像不行,因为按钮点击事件是由系统触发的,所以无法传递一个EventArgs的实例给它。看来只能在sender上想办法了,可以从Button继承一个类,在这个子类里添加自己想要的属性,然后再事件处理方法里将从sender里拿想要的数据。。
      

  6.   

    你可以写b[i].Click += (sd,arg) =>{ write_Click(str1, str2, str3, a); } ;
      

  7.   


    意思有了,但是不正确。把你的 #4 楼的代码可以修改一下,例如:
    public class MyClickDelegate
    {
      public string Str1;
      public string Str2;
      public string Str3;
      public string A;  public void write_Click(object sender, EventArgs e) {
        MyEventArgs myEventArgs = e as MyEventArgs;
        // 其他代码。。
      }
    } 而主程序则写var clk= new MyClickDelegate{ Str1= str1, Str2=str2, Str3=str3, A=a};
    b[i].Click += new EventHandler(clk.write_Click);不过,早在7、8年前,c#就应支持匿名函数了。并且在3、4年前c#也早就支持lamda表达式。因此不论是使用匿名函数还是lamda,其实都不需要这么麻烦地去为了封装这4个参数而单独设计class。