1

contextmenustripのアイテムを他の利用items.addrange方法に移行したい。for ループを使用してアイテムを 1 つずつ転送できます。

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

items.addrangeしかし、メソッドを使用してアイテムを転送するにはどうすればよいですか?

4

3 に答える 3

1

現在のループには、 AddRange() を使用した場合とまったく同じ問題があります。アイテムが CMS から別の CMS に移動されると、Items コレクションが変更されます。インデックスが無効になると、コードが爆撃されます。

これを行う安全な方法の 1 つは、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 で十分と思われます)。次に、配列を 2 番目の 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 に答える