Рейтинг:
6
Wendelius
Не уверен, правильно ли я понял вопрос, но из того, что я понял, вы хотите удалить соответствующие узлы независимо от того, на каком уровне они найдены. Для этого вам нужна рекурсия.
Взгляните на следующий пример. Сначала я добавляю некоторые узлы в древовидное представление, а затем удаляю все элементы, содержащие текст B
Dim treenode As TreeNode
' Add example data
treenode = Me.TreeView1.Nodes.Add("A")
treenode.Nodes.Add("B")
treenode.Nodes.Add("C")
treenode = Me.TreeView1.Nodes.Add("B")
treenode = treenode.Nodes.Add("C")
treenode.Nodes.Add("D")
treenode = Me.TreeView1.Nodes.Add("C")
treenode = treenode.Nodes.Add("B")
treenode.Nodes.Add("A")
'recursively remove desired nodes
Me.RemoveNodesByText("B", Me.TreeView1)
End Sub
Private Function RemoveNodesByText(ByVal nodetext As String, ByVal treeview1 As TreeView, Optional childnode As TreeNode = Nothing) As Boolean
Dim nodesToIterate As TreeNodeCollection
If childnode Is Nothing Then
nodesToIterate = treeview1.Nodes
Else
nodesToIterate = childnode.Nodes
End If
For nodecounter As Integer = nodesToIterate.Count - 1 To 0 Step -1
' recursively loop through children
RemoveNodesByText(nodetext, treeview1, nodesToIterate(nodecounter))
' remove this node if matches the given node text
If nodesToIterate(nodecounter).Text = nodetext Then
nodesToIterate(nodecounter).Remove()
End If
Next
Return True
End Function
Одна вещь заключается в том, что в примере кода новый узел не добавляется внутри рекурсивной функции. В противном случае будет создано несколько новых узлов, поэтому, если вы хотите убедиться, что существует только один узел в своем роде, сначала удалите дубликаты, а затем добавьте новый узел в нужное место.
Member 11856456
Это очень интересный код, но когда я запускаю его на основе текста, он удаляет весь текст, который является "B". То, что я хочу сделать, основываясь на вашем примере, заключается в том, что если база данных имеет 3 B, то я хочу только 1 B.
Wendelius
Обратите внимание, конечно, если я понимаю. Вы добавляете узел для всех строк, которые пришли из базы данных, и хотите, чтобы осталась только последняя?
Например
- А извлечена из базы данных, добавленных к узлам
- B извлекается из базы данных, B добавляется в узлы
- C извлекается из базы данных, c добавляется в узлы
- B извлечен из базы данных, preivous B удален, новый B добавлен в узлы
- и так далее...
Member 11856456
Поэтому, как только я получаю базу данных в treeview, у меня есть столбец округа и столбец штата. Например, я использовал Кентукки в качестве штата, и здесь у меня есть 3 разных округа.
Кентукки-
Флойд
Флойд
Флойд
Флойд
Джефферсон
Джефферсон
Джефферсон
Щука
Щука
то, что я хочу сделать, это удалить дублированный текст и сохранить только 1 из каждого
Кентукки-
Флойд
Джефферсон
Щука
это просто пример, у меня есть другие колонки, которые я хотел бы сделать таким же образом в то же время.
Wendelius
Хорошо, рекурсивная функция в основном справилась бы с этим, если бы у вас была следующая логика
для каждой строки в datatable
RemoveNodesByText (row ("county"), treeview1)
Элемента управления treeview1.Узлы.Добавить (строка ("округ"))
следующий
это гарантировало бы, что останется только последнее.
Однако это не решит ситуацию для нескольких столбцов. Если вы удаляете узлы также на основе текста в других столбцах, что делать, если комбинация столбцов уникальна, должна ли она остаться?
Чем больше информации вы предоставляете, тем больше это звучит так, как будто вам нужно будет изменить запрос базы данных, чтобы возвращать только уникальные комбинации. Например, если у вас сейчас есть
выберите округ, город, штат из mytable
вы можете использовать ключевое слово distinct для удаления дубликатов при извлечении данных:
выберите отдельный округ, город, штат из mytable
Таким образом, вам не нужно будет удалять уже добавленные узлы.