C# - 使用foreach循环迭代重复的上下文菜单项

时间:2013-08-10 10:42:38

标签: c# .net-4.0 foreach contextmenu repeat

我目前正在开发一个小项目,需要在某些上下文菜单项中重复一些。菜单以右键单击上下文菜单开始,并以不同颜色分支,然后分支到对象。根据所选的颜色和对象,表单上的对象将发生变化。它很乱,但不幸的是我看不到更简单的方法来完成这个(谢天谢地,只需要在一个菜单上完成)。

我已将颜色创建为菜单项并添加它们,但每种颜色重复相同的8个对象:

foreach (MenuItem i in colors.MenuItems)
{
    MenuItem one = new MenuItem();
    one.Text = "One";
    MenuItem two = new MenuItem();
    two.Text = "Two";
    MenuItem three = new MenuItem();
    three.Text = "Three";
    MenuItem four = new MenuItem();
    four.Text = "Four";
    MenuItem five = new MenuItem();
    five.Text = "Five";
    MenuItem six = new MenuItem();
    six.Text = "Six";
    MenuItem seven = new MenuItem();
    seven.Text = "Seven";
    MenuItem eight = new MenuItem();
    eight.Text = "Eight";
    i.MenuItems.Add(one);
    i.MenuItems.Add(two);
    i.MenuItems.Add(three);
    i.MenuItems.Add(four);
    i.MenuItems.Add(five);
    i.MenuItems.Add(six);
    i.MenuItems.Add(seven);
    i.MenuItems.Add(eight);
}

首先,我认为在foreach循环中创建所有对象菜单项是低效的,所以我在它之前移动它们。当我这样做时,对象只被添加到最终颜色,而不是所有颜色。这似乎很奇怪,如果有人能解释为什么会发生这种情况,我会很感激。

其次,计划是根据人选择的菜单选项更改右键单击的对象。除了为每个单独的菜单项设置Menu.Click事件之外,是否有更简单的方法来选择菜单项?

非常感谢任何帮助。

提前致谢, 鲍勃

2 个答案:

答案 0 :(得分:0)

我无法回答您的问题,因为我不清楚上下文,但至少代码可以更短:

var textvalues = new[] {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"};

foreach (MenuItem i in colors)
{
    var newItems = textvalues.Select(t => new MenuItem{Text = t});
    foreach (MenuItem newItem in newItems)
    {
        i.MenuItems.Add(newItem);
    }
}

答案 1 :(得分:0)

  

首先,我认为拥有所有对象效率低下   在foreach循环中创建的菜单项,所以我只是移动了它们   在它之前。当我这样做时,对象只被添加到最后   颜色,而不是所有。这看起来很奇怪,我会   如果有人可以解释为什么会发生这种情况,那就表示赞赏。

每个MenuItem只能是一个对象的子节点。该框架正在默默地将它作为孩子的最后一个孩子。

通过采用与Alex Siepman解决方案类似的方法,可以从代码中删除大量重复。我添加了Click处理程序并进行了其他小的更改。

void Something()
{
    MyColoredObject o = //something
    var textValues = new[] {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"};

    foreach (MenuItem color in colors.MenuItems)
    {
        for (int i = 1; i <= 8; i++)
        {
            MenuItem newItem = new MenuItem();
            newItem.Text = textValues[i];
            newItem.Click += NumberClickHandler(o, color, i);
            color.MenuItems.Add(newItem);
        }
    }
}
EventHandler NumberClickHandler(MyColoredObject o, MenuItem color, int num)
{
    return (s, e) =>
    {
        // assign the color to o as identified by color and num
    };
}