【问题标题】:How to move items back and forth between a TreeView and CheckedListBox?如何在 TreeView 和 CheckedListBox 之间来回移动项目?
【发布时间】:2020-05-22 23:06:09
【问题描述】:

我一直在尝试找到一种将多个选中项从 TreeView 移动到 CheckedListBox 的方法。我在每个设置中都设置了一个虚拟数据,每个设置下方都有一个按钮,用于从一个容器移动到下一个容器。我从按钮开始从 TreeView 移动到 CheckedListBox,但我遇到了麻烦。我的节点变量的对象引用未设置为对象错误的实例。这就是我正在尝试的:

代码

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    For Each node As TreeNode In TreeView1.Nodes
        If (node.Checked) Then
            Dim name As String = node.Text.ToString
            node.Remove()
            CheckedListBox1.Items.Add(name)
        End If
    Next
End Sub

我不一定需要使用按钮来移动它们,我只需要能够一次移动多个项目。任何帮助将不胜感激,在此先感谢。

【问题讨论】:

  • 代码有什么问题?告诉我们总是有帮助的。是的,当你使用 for-each 循环时,你不能修改集合。
  • @LarsTech 您将如何遍历节点?我希望能够查看检查了哪些节点并将它们移动到列表框。

标签: vb.net treeview treenode checkedlistbox


【解决方案1】:

您不能在 For-Each 循环中修改集合。尝试以相反的顺序循环以避免弄乱 TreeNodes 的索引顺序:

Dim movingNodes As New List(Of String)
For i As Integer = TreeView1.Nodes.Count - 1 To 0 Step -1
  Dim node As TreeNode = TreeView1.Nodes(i)
  If node.Checked Then
    movingNodes.Add(node.Text)
    node.Remove()
  End If
Next
movingNodes.Reverse()
CheckedListBox1.Items.AddRange(movingNodes.ToArray)

要将 CheckedListBox 中的项目移回 TreeView:

Dim movingNodes As New List(Of String)
For i As Integer = CheckedListBox1.Items.Count - 1 To 0 Step -1
  If CheckedListBox1.GetItemChecked(i) Then
    movingNodes.Add(CheckedListBox1.Items(i))
    CheckedListBox1.Items.RemoveAt(i)
  End If
Next
movingNodes.Reverse()
For Each s As String In movingNodes
  TreeView1.Nodes.Add(s)
Next

【讨论】:

  • 效果很好,我还有一个问题。我需要做一些类似的事情来从列表框转到树视图。而不是“Dim node As TreeNode = TreeView1.Nodes(i)”,如何为选中列表框的项目编写?
  • @ConnorS。更新了帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 2016-01-06
相关资源
最近更新 更多