将不同的对象发送到事件处理程序

时间:2016-07-06 22:10:20

标签: c# events event-handling

我有一个ComboBoxes数组:

ComboBox[] boxes = new ComboBox[3]{ComboBox box1, ComboBox box2, ComboBox box3};

每个ComboBox在索引更改时都会传递给同一个事件处理程序:

foreach (ComboBox box in boxes)
{
  box.SelectedIndexChanged += new EventHandler(this.Box_Changed);
}

我想要做的是将整个boxes[]数组传递给事件处理程序,而不是单个ComboBox。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

你无法真正改变发送给回调的内容,因为代表你的框架会调用它。

你可以在其他地方找到存储数据的地方,比如每个ComboBox的.Tag属性,或者你可以创建一个简单的小助手方法,它知道ComboBox并让它为你传递数据。

public void Example(ComboBox[] boxes)
{
    // Using a statement lambda to wrap the call
    foreach (ComboBox box in boxes)
    {
        box.SelectedIndexChanged += new EventHandler((sender, e) =>
        {
            Box_Changed_Example1(boxes, sender, e);
        });
    }

    // Or, use the .Tag property to store the data
    foreach (ComboBox box in boxes)
    {
        box.Tag = boxes;
        box.SelectedIndexChanged += new EventHandler(Box_Changed_Example2);
    }
}

void Box_Changed_Example1(ComboBox[] boxes, object sender, EventArgs e)
{
    // TODO
}

void Box_Changed_Example2(object sender, EventArgs e)
{
    ComboBox[] boxes = (ComboBox[])((ComboBox)sender).Tag;
    // TODO
}