我目前正在开发一个小项目,需要在某些上下文菜单项中重复一些。菜单以右键单击上下文菜单开始,并以不同颜色分支,然后分支到对象。根据所选的颜色和对象,表单上的对象将发生变化。它很乱,但不幸的是我看不到更简单的方法来完成这个(谢天谢地,只需要在一个菜单上完成)。
我已将颜色创建为菜单项并添加它们,但每种颜色重复相同的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事件之外,是否有更简单的方法来选择菜单项?
非常感谢任何帮助。
提前致谢, 鲍勃
答案 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
};
}