我有一个事件处理程序,我想将一些参数传递给事件
像这样,该行触发错误:预期的方法名称 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 :(得分: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"]);