使用更多参数订阅方法和eventhandler

时间:2012-10-05 16:03:59

标签: c# .net visual-studio-2010

我找不到类似于我期望发生的解决方案。如何在我想订阅的方法中添加其他参数?

假设下面的这一行是订阅鼠标悬停的代码:

Panel cagePanel = new Panel();
cagePanel.MouseHover += new EventHandler(frmMain_MouseHover);

void frmMain_MouseHover(object sender, EventArgs e){ 
    // I wanna add some 'int index' parameter after 'e' variable) 
}

我真正想要的是这样:

void frmMain_MouseHover(object sender, EventArgs e, int index){ 
    strings[index] = "bla bla bla";
}

2 个答案:

答案 0 :(得分:2)

  

我找不到类似于我期望发生的解决方案。如何在我想订阅的方法中添加其他参数?

你做不到。代码如何提升事件(Panel.OnMouseHover或其他什么)知道要提供什么值?

如果您在订阅事件时知道,您可以使用lambda表达式基本上委派调用,提供额外信息:

// 10 is just an example here - use whatever value you want for index
cagePanel.MouseHover += (sender, args) => frmMain_MouseHover(sender, args, 10);

编辑:要遍历数组中的每个控件并为每个控件订阅一个合适的处理程序,您可以使用以下内容:

for (int i = 0; i < array.Length; i++)
{
    // See http://tinyurl.com/3b2hoft for reasons behind the copy
    int index = i;
    array[i].MouseHover += (s, args) => frmMain_MouseHover(s, args, index);
}

我个人会尽量避免需要这样做,但是 - 您是否可以通过sender部分检测索引,可能使用Array.IndexOf

答案 1 :(得分:2)

您不能,但如果您需要的额外数据与发送事件的内容相关,则可以使用sender值。例如,如果您想知道引发事件的项目的控件列表中的索引,您可以执行以下操作:

int i = controlList.IndexOf(sender);