0

我找不到类似于我期望发生的解决方案。如何向要订阅的方法添加附加参数?

假设下面这一行是订阅 mouseover 的代码:

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

2 回答 2

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

于 2012-10-05T16:07:59.463 回答
2

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

int i = controlList.IndexOf(sender);    
于 2012-10-05T16:12:29.280 回答