2016-06-17 20 views
0

我在Windows窗体应用程序中有两个ContextMenuStrip(s),其中一个有3个项目,另一个没有。C# - 重复的ContextMenuStrip项目到另一个

让我们假设这样的:

ContextMenuStrip c1 = new ContextMenuStrip(); 
ContextMenuStrip c2; 

C1有3 ToolStripMenuItems,C2是ContextMenuStrip目的地,C1项目应被复制。

我试着写:

c2 = new ContextMenuStrip(c1.Container); 

,但它给了我一个ArgumentNullException因为c1.Container等于null

我不知道如何解决这个问题,你能帮助我吗?

Ps。 我会new ToolStripMenuItem(S),没有提及

whileforeach循环解决方案不能做到这一点的最好办法。

谢谢:)

+1

你有一些创建ContextMenuStrip对象的代码。再次调用它。 –

+0

你能举个例子吗? –

回答

1

然后,。有创建的ContextMenuStrip的功能,并调用它每一个新的菜单需要

Func<ContextMenuStrip> newContextMenuStrip =() => { 
    var c = new ContextMenuStrip(); 
    c.Items.Add("item 1"); 
    c.Items.Add("item 2"); 
    c.Items.Add("item 3"); 
    return c; 
}; 

var c1 = newContextMenuStrip(); 
var c2 = newContextMenuStrip(); 
+0

嗯..我要试试这个,我会让你知道 –

+0

这是一个令人难以置信的解决方案,它完美的工作。非常感谢 :) –

0

您需要创建一个新的ContextMenuStrip并添加Item S(不是c1Container到新的菜单:

c2 = new ContextMenuStrip(); 
c2.Items.AddRange(c1.Items); 

但是请注意,这并不是重复该项目。相同项目实例现在在两个菜单中。

如果你想克隆它们,这是相当复杂的,因为你必须照顾项目的特定类型,要克隆的属性,特别是事件处理程序。

一个简单的例子可以是:

c2.Items.AddRange(c1.Items.OfType<ToolStripItem>() 
          .Select(item => new ToolStripMenuItem(item.Text)) 
          .OfType<ToolStripItem>().ToArray()); 

第二OfType是必要的,以避免对ToolStripItem[]其通过AddRange()预期从ToolStripMenuItem[]共变体阵列转换。


而且一个侧面说明:Container包含菜单(thatswhy它的null时,不显示菜单),而不是在菜单保持在其项目的东西分量

+0

是的,你是对的,这给了我相同的实例,但不是新的“克隆”实例..但是谢谢你:) –

+0

@EdoardoChiabra克隆项目有点复杂,我认为你不能这样做“在一行中“。首先你必须关心具体的项目类型,其次你需要知道你想克隆哪些属性,这对于'Click'事件处理程序来说特别复杂。 –

+0

我知道“一条线解决方案”是乌托邦,你对此有何建议? 循环? –

1

迟到了时间,但我已经在过去同样的问题,发现reasonab简单的解决方案。

说你的toolStripMenuItem在上下文菜单中声明为'TSMI_open', 你可以在打开的上下文菜单之间有效地热插拔它。 事情是这样的:

void Context1_Opening(object sender, CancelEventArgs e) 
{ 
    Context1.Items.Insert(0, TSMI_open); 
} 

void Context2_Opening(object sender, CancelEventArgs e) 
{ 
    Context2.Items.Insert(0, TSMI_open); 
} 

菜单项就会出现在菜单时无缝连接,如果同一菜单打开连续两次将导致没有任何错误。

相关问题