为多个对象使用事件处理程序

时间:2013-05-23 17:48:46

标签: c# winforms

我在List<myObject>中有20个项目。每个都有一个与UserControl相关联的实例。每个对象都可以通过MenuStrip访问,需要在单击相应项目时显示UserControl。目前我有一个事件处理程序,每个都有效,但我想知道是否存在一种方法来简化这个并为所有项使用单个事件处理程序。

这可能吗?如果是这样的话,最好的方法是什么。

编辑:其他人可以就此问题提供任何意见吗?我在使用Mailo的答案时遇到了麻烦。基本上我需要做的就是创建一个事件处理程序,当单击正确的MenuStrip项时,该事件处理程序可以显示存储在UserControl中的相应List<myObject>作为属性。有没有更简单的方法来做到这一点?理想情况下,我想这样做,以便foreach循环可以遍历列表并设置处理程序。

有没有人可以帮我这个?

3 个答案:

答案 0 :(得分:3)

这不是很困难。首先,您需要一些方法将菜单项与列表中的控件相关联。

1)由于你有一个列表,索引是最简单的方法(你可以使用Dictionary&lt;&gt;来简化这种关联)。因此,当您单击第一个菜单项时,您希望显示myObjecList[0]。当您单击第二个MenuItem时,将出现myObjectList[1],依此类推。为此,请转到每个菜单项,并在“属性”中为“{1}}属性指定值”。对于第一个菜单项,将Tag指定为0,对于第二个项目,将Tag指定为1 - 依此类推。

2)创建一个事件处理程序并为所有菜单项分配相同的处理程序。事件处理程序可能如下所示:

Tag

答案 1 :(得分:0)

您可以将sender对象传递给事件处理程序并检查处理程序中的类型

它将是这样的

    //this will contain any properties you wanna send to the handler 
public class MyHandlerEventArgs : EventArgs
{

}

//this delegate gets the sender, you can change the sender type to be the encapsulated type of your controls
public delegate void MyHandler(object sender, MyHandlerEventArgs args);

//this is the class that fires the event in your case it will UI class I think
public class  MyController
{
    public event MyHandler myEvent;

    public void MyEvent_Fire()
    {
        if(myEvent != null)
            myEvent(this, new MyHandlerEventArgs());
    }
}

//here you can do your business logic for each control
public class MyAction
{
    MyController mc = new MyController();
    public MyAction()
    {
        mc.myEvent += new MyHandler(mc_myEvent);
    }

    void mc_myEvent(object sender, MyHandlerEventArgs args)
    {
        //check the sender type 
        //do your action
    }
}

此链接可能对您有用 check

答案 2 :(得分:0)

您可能需要ItemClicked中的MenuStrip事件。您可以使用ClickedItem中的ToolStripItemClickedEventArgs来查找UserControl

一些伪代码:

// Initialize
myMenuStrip.ItemClicked += itemClickedEvent;

// ...
void itemClickedEvent(Object sender, ToolStripItemClickedEventArgs e)
{
  int index = myObjectList.FindIndex(e => e.instanceOfUserControl == e.ClickedItem);
  // Now that we have the clicked item, display it how we would in an individual event handler.
  myObjectList[index].instanceOfUserControl.DoDisplay();
}

  

理想情况下,我想这样做,以便foreach循环可以遍历列表并设置处理程序。

对于这种方法,您可以在foreach

上使用List
foreach (var listItem in myObjectList)
{
  listItem.TheEvent += myEventHandler;
}