方法名称预期c#

时间:2014-03-07 17:07:52

标签: c# event-handling

我有一个事件处理程序,我想将一些参数传递给事件

像这样,该行触发错误:预期的方法名称

   p.Click += new System.EventHandler(P_Click(sender, new MyEventArgs { design = reader1["desig_prd"].ToString(), prix = (float)reader1["prix_prd"] }));

我的P_Click事件

public void P_Click(Object sender, EventArgs e)
    {
        var args = (MyEventArgs)e;
        string deignation = args.design;
        MessageBox.Show(deignation);
    }

我有像这样的类MyEventArgs

class MyEventArgs : EventArgs
{
    public string design { get; set; }
    public float prix { get; set; }
}

有任何帮助吗? 提前致谢

4 个答案:

答案 0 :(得分:3)

订阅事件处理程序时,不能将参数传递给方法。您应该只指定方法名称:

p.Click +=  new EventHandler(P_Click);

或简短表示法:

p.Click +=  P_Click;

如果你想手动触发并传递一些参数,那么你应该用这些参数调用你的方法:

P_Click(this, new MyEventArgs { design = reader1["desig_prd"].ToString(), 
                                prix = (float)reader1["prix_prd"] 
                              });

但这通常是一种不好的做法,(手动触发事件处理程序方法)。在订阅事件处理程序之后使用PerformClick方法,当然为参数创建另一种方法,并从{{1}调用该方法}}:

P_Click

答案 1 :(得分:1)

将其更改为此

 p.Click += new System.EventHandler(P_Click);

答案 2 :(得分:1)

你误解了事件的运作方式。

事件是

p.Click

P_Click是事件处理程序。

您不发送发件人和事件参数 - 因为事件确实如此。 因此,只需p.Click += new System.EventHandler(P_Click);或简单p.Click += P_Click;

即可将事件挂钩

你不需要MyEventArgs(至少不是这种情况),而只是在事件hadler本身计算这些值:

public void P_Click(Object sender, EventArgs e)
{
    var design = reader1["desig_prd"].ToString();
    var prix = (float)reader1["prix_prd"];
    ...
}

答案 3 :(得分:1)

使用lambda来关闭要在事件处理程序中使用的数据:

p.Click += (s, args) => 
    P_Click(reader1["desig_prd"].ToString(), (float)reader1["prix_prd"]);