【问题标题】:Transfer items between contextmenustrips vb.net在 contextmenustrips vb.net 之间传输项目
【发布时间】:2013-11-02 02:44:14
【问题描述】:

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

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

但是如何使用items.addrange 方法传输项目?

【问题讨论】:

    标签: vb.net contextmenustrip


    【解决方案1】:

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

    Dim tsi(ContextMenuStrip1.Items.Count - 1) As ToolStripItem
    ContextMenuStrip1.Items.CopyTo(tsi, 0)
    ContextMenuStrip2.Items.AddRange(tsi)
    

    【讨论】:

      【解决方案2】:

      您现在的循环与使用 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)
      

      【讨论】:

        【解决方案3】:

        将您的 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-19
          • 2017-02-25
          • 1970-01-01
          • 2017-04-20
          • 2022-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多