1

我想将项目转移contextmenustrip到其他使用items.addrange方法。我可以使用 for 循环一个一个地传输项目:

For each Item in ContextMenuStrip1.items
ContextMenuStrip2.Items.Add(item)
Next

但是我如何使用items.addrange方法转移项目?

4

3 回答 3

1

您现在拥有的循环具有与使用 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)
于 2013-05-26T14:47:39.593 回答
1

您需要将原始 ContextMenuStrip 中的元素复制到一个数组中(CopyTo 似乎就足够了),然后将数组添加到第二个 ContextMenuStrip 很简单

Dim tsi(ContextMenuStrip1.Items.Count - 1) As ToolStripItem
ContextMenuStrip1.Items.CopyTo(tsi, 0)
ContextMenuStrip2.Items.AddRange(tsi)
于 2013-05-26T14:47:48.067 回答
1

将您的 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
于 2013-05-26T15:58:13.987 回答