contextmenustrip
のアイテムを他の利用items.addrange
方法に移行したい。for ループを使用してアイテムを 1 つずつ転送できます。
For each Item in ContextMenuStrip1.items
ContextMenuStrip2.Items.Add(item)
Next
items.addrange
しかし、メソッドを使用してアイテムを転送するにはどうすればよいですか?
contextmenustrip
のアイテムを他の利用items.addrange
方法に移行したい。for ループを使用してアイテムを 1 つずつ転送できます。
For each Item in ContextMenuStrip1.items
ContextMenuStrip2.Items.Add(item)
Next
items.addrange
しかし、メソッドを使用してアイテムを転送するにはどうすればよいですか?
現在のループには、 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)
元の ContextMenuStrip から要素を配列にコピーする必要があります (これには CopyTo で十分と思われます)。次に、配列を 2 番目の 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