我想将项目转移contextmenustrip
到其他使用items.addrange
方法。我可以使用 for 循环一个一个地传输项目:
For each Item in ContextMenuStrip1.items
ContextMenuStrip2.Items.Add(item)
Next
但是我如何使用items.addrange
方法转移项目?
我想将项目转移contextmenustrip
到其他使用items.addrange
方法。我可以使用 for 循环一个一个地传输项目:
For each Item in ContextMenuStrip1.items
ContextMenuStrip2.Items.Add(item)
Next
但是我如何使用items.addrange
方法转移项目?
您现在拥有的循环具有与使用 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)
您需要将原始 ContextMenuStrip 中的元素复制到一个数组中(CopyTo 似乎就足够了),然后将数组添加到第二个 ContextMenuStrip 很简单
Dim tsi(ContextMenuStrip1.Items.Count - 1) As ToolStripItem
ContextMenuStrip1.Items.CopyTo(tsi, 0)
ContextMenuStrip2.Items.AddRange(tsi)
将您的 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