Как перемещать элементы назад и вперед между TreeView и CheckedListBox? - PullRequest
1 голос
/ 06 февраля 2020

Я пытался найти способ переместить несколько отмеченных элементов из TreeView в CheckedListBox. У меня есть один из них с фиктивными данными и кнопка под каждым для перемещения из одного контейнера в другой. Я начал с кнопки, чтобы перейти от TreeView к CheckedListBox, но у меня возникли проблемы с ним. Я получаю ссылку Object, не установленную на экземпляр ошибки объекта для моей переменной узла. Вот что я пытался:

Код

 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

Мне не обязательно использовать кнопку для их перемещения, мне просто нужно иметь возможность перемещать несколько элементов одновременно , Любая помощь будет оценена, спасибо заранее.

1 Ответ

3 голосов
/ 06 февраля 2020

Нельзя изменить коллекцию в For-Each l oop. Попробуйте выполнить цикл в обратном порядке, чтобы избежать путаницы в порядках индексов 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
...