2014-03-07 57 views
1

我有一个事件处理程序,我想传递一些参数到事件方法名称预计C#

这样,该行触发错误:方法名预计

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; } 
} 

任何帮助? 在此先感谢

+0

你有从'P_Click'方法的范围访问'reader1'? –

回答

3

你不能参数传递给你的方法,当你订阅的事件handler.You应该只是指定方法名称:

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方法订阅后,您的事件处理程序,当然,创建另一个方法为你的论点,并呼吁从P_Click该方法:

p.PerformClick(); 
+0

打我吧;) – BradleyDotNET

+0

'p.Click + = P_Click;'不起作用,因为'P_Click'没有合适的签名。他将无法触发事件,或者在事件处理程序被触发时向事件处理程序提供不同的参数,因为他不控制定义/触发事件的对象的定义,也不能定义类访问此事件数据提供何时被触发。 – Servy

+0

如果'p'是一个'button',@Servy是的方法签名是正确的。你认为它不是一个按钮? –

1

更改为此

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

这并不能解决他如何在点击处理程序中访问所需数据的问题。 – Servy

1

您误会了事件的工作方式。

p.Click是事件。

P_Click是事件处理程序。

您不发送发件人和事件参数 - 因为该事件。 所以要挂钩事件所有你需要的是p.Click += new System.EventHandler(P_Click);或事件只是p.Click += P_Click;

你不需要MyEventArgs(至少不是这种情况),取而代之的,只是在事件本身哈德勒计算这些值:

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

这并不能解决他如何在点击处理程序中访问所需数据的问题。 – Servy

+0

这些数据在点击事件处理程序中可用,但我会编辑它 –

+0

但这就是整个观点,'reader1'不在事件处理程序的范围内,只在处理程序被连接的地方。 – Servy

1

使用lambda时可以关上,你想在你的事件处理程序使用的数据:

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