4

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

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

编辑:其他人可以就这个问题提供任何意见吗?我对 Mailo 的回答有疑问。基本上,我需要做的就是创建一个事件处理程序,当单击正确的 MenuStrip 项目时,它可以显示UserControl存储在 a中的适当属性。List<myObject>有没有更直接的方法来做到这一点?理想情况下,我想这样做,以便foreach循环可以遍历列表并设置处理程序。

没有人可以帮助我解决这个问题吗?

4

3 回答 3

3

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

1)由于您有一个列表,因此索引是最简单的方法(您可以使用 Dictionary<> 来简化这种关联)。因此,假设当您单击第一个菜单项时,您想要myObjecList[0]出现。当您单击第二个 MenuItem 时,myObjectList[1]会出现等等。为此,请转到每个菜单项,然后在“属性”中为属性分配一个值Tag。对于第一个菜单项,分配Tag给 0,对于第二个菜单项,分配Tag给 1 - 依此类推。

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

private void myToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // source menu item which was clicked
            ToolStripMenuItem item = sender as ToolStripMenuItem;

            if(item != null) 
            {
                int index = int.Parse(item.Tag.ToString()); // get the index from Tag
                myObject control = myObjectList[index];

                // do your stuff with your control

            }
        } 
于 2013-05-26T06:00:24.320 回答
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
    }
}

此链接可能对 检查有用

于 2013-05-23T18:14:44.000 回答
0

您可能希望ItemClickedMenuStrip. 您可以使用ClickedItemfromToolStripItemClickedEventArgs找到您的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 循环可以遍历列表并设置处理程序。

对于这种方法,您可以foreachList

foreach (var listItem in myObjectList)
{
  listItem.TheEvent += myEventHandler;
}
于 2013-05-26T01:18:31.667 回答