【发布时间】:2013-11-02 02:44:14
【问题描述】:
我想使用items.addrange 方法将contextmenustrip 的项目转移给其他人。我可以使用 for 循环一个一个地传输项目:
For each Item in ContextMenuStrip1.items
ContextMenuStrip2.Items.Add(item)
Next
但是如何使用items.addrange 方法传输项目?
【问题讨论】:
我想使用items.addrange 方法将contextmenustrip 的项目转移给其他人。我可以使用 for 循环一个一个地传输项目:
For each Item in ContextMenuStrip1.items
ContextMenuStrip2.Items.Add(item)
Next
但是如何使用items.addrange 方法传输项目?
【问题讨论】:
您需要将原始 ContextMenuStrip 中的元素复制到一个数组中(CopyTo 似乎足够了),然后将数组添加到第二个 ContextMenuStrip 很简单
Dim tsi(ContextMenuStrip1.Items.Count - 1) As ToolStripItem
ContextMenuStrip1.Items.CopyTo(tsi, 0)
ContextMenuStrip2.Items.AddRange(tsi)
【讨论】:
您现在的循环与使用 AddRange() 的问题完全相同。当项目从一个 CMS 移动到另一个 CMS 时,它正在修改 Items 集合。当索引变得无效时,这会破坏您的代码。
执行此操作的一种安全方法是向后迭代 Items 列表,这样对集合的更改不会使索引无效。像这样:
For ix = ContextMenuStrip1.Items.Count - 1 To 0 Step -1
ContextMenuStrip2.Items.Insert(0, ContextMenuStrip1.Items(ix))
Next
如果您想使用 AddRange,那么您需要制作 Items 集合的副本,以便移动项目不会使源无效。您可以为此使用 Linq,如下所示,为了清晰起见:
Dim items = ContextMenuStrip1.Items.OfType(Of ToolStripItem).ToArray()
ContextMenuStrip2.Items.AddRange(items)
【讨论】:
将您的 contextmenu1 复制到 contextmenu2 ..
Private Sub CopyMyMenus()
' Create empty array to store ContextMenuStrip1 objects.
Dim myItems(ContextMenuStrip1.MenuItems.Count) As MenuItem
' Copy elements of the ContextMenuStrip1 MenuItem collection to array.
ContextMenuStrip1.MenuItems.CopyTo(myItems, 0)
' Add the array to the menu item collection of the ContextMenu.
contextMenu2.MenuItems.AddRange(myItems)
End Sub
【讨论】: