VB. NET Добавляет несколько дочерних узлов в Treeview

#asp.net #vb.net #treeview #child-nodes

#asp.net #vb.net #просмотр дерева #дочерние узлы

Вопрос:

У меня много записей в базе данных, и мне нужно динамически заполнять мой treeview следующим образом: Ниже приведен лишь пример того, что мне нужно:

 TreeView1.Nodes(a).ChildNodes.Add(New TreeNode("ChildNode " amp; b))
TreeView1.Nodes(a).ChildNodes(b).ChildNodes.Add(New TreeNode("ChildNode 2 lvl " amp; b))
  

Я получаю записи из базы данных MySQL, и мне нужно знать, как я могу добавить многоуровневые дочерние узлы в цикл для … Далее и т.д…

У вас есть какие-либо предложения или идеи???

Ответ №1:

если вы хотите работать с различными уровнями Treenodes, вы можете использовать функцию Find

Dim TempNode As TreeNode = TreeView1.Nodes.Find("Node where I want to add SubNode", True).FirstOrDefault

TempNode.Nodes.Add("SubNode", "SubNode")

Таким образом, вы можете добавить подузел к любому выбранному вами узлу.

.Find("key",True) находит treenodes по следующему ключу и .FirstOrDefault выбирает первый. Наконец, вы просто добавляете новый подузел в Tempnode.

Вы считали, что получаете это динамически и из MySQL. Это может вызвать ошибку типа «Действие, предварительно сформированное для этого элемента управления, вызывается не из того потока. Перенаправьте в правильный поток, используя Contol.Вызывать или управлять.BeginInvoke для выполнения этого действия.» Просто измените TempNode.Nodes.Add("SubNode", "SubNode") на TreeView1.Invoke(Sub() TempNode.Nodes.Add("SubNode", "SubNode"))

ПРИМЕР:

 Dim comm As String = "SELECT * FROM YourTableName"
Dim SqlCmnd as SqlCommand = New SqlCommand(comm, YourMySqlConnection)
Dim READER As SqlDataReader
READER = SqlCmnd.ExecuteReader
While READER.Read
    Dim NewNode As TreeNode = New TreeNode(READER.Item("origCategoryID"))
    TreeView1.Nodes.Add(NewNode)
    NewNode.Nodes.Add(READER.Item("categoryOrderID"))
End While
READER.Close()
  

ПРИМЕР 2:

вывод
База данных

 While READER.Read
If TreeView1.Nodes.Find(READER.Item("OrigCatOrderID"), True).Length > 0 Then
Dim NewNode As TreeNode = TreeView1.Nodes.Find(READER.Item("OrigCatOrderID"), True).FirstOrDefault
NewNode.Nodes.Add(READER.Item("CatOrderID"), READER.Item("CatOrderID"))
Else
TreeView1.Nodes.Add(READER.Item("OrigCatOrderID"), READER.Item("OrigCatOrderID"))
TreeView1.Nodes(READER.Item("OrigCatOrderID")).Nodes.Add(READER.Item("CatOrderID"), READER.Item("CatOrderID"))
End While
  

Комментарии:

1. Спасибо за вашу помощь!! Могу я попросить вас записать только пример??? Я не знаком с этим компонентом!

2. @Ecusad Можете ли вы указать структуру вашей базы данных, чтобы написать правильный пример?

3. У меня есть 3 столбца — «OrigCategoryOrderID», «CategoryOrderID» и «CategoryName». В первом я сохраняю фактический NodeID, во втором я сохраняю ChildNodeID. Я приведу пример: Node1(origCategoryID) - ChildNode1(categoryOrderID) or Node1 - Node1a(OrigCategoryOrderID) - ChildNode1a(categoryOrderID) … Я надеюсь, вы понимаете, что я имею в виду

4. Я написал пример с базой данных Sql, а не MySQL, но на самом деле это то же самое. Я надеюсь, вы не возражаете. Я полагаю, вы знаете, как работать с SQL, поэтому я написал не весь код (объявление SQL-соединения, открытие, …), а только основную часть. Пример приведен в отредактированном ответе, если вам нужно что-то указать в примере или добавить какую-либо функцию, напишите мне.

5. Спасибо за вашу помощь!!! Я пытаюсь применить то, что вы предлагаете, в своем коде, и когда я закончу, я дам вам знать!!!! На всякий случай, можете ли вы привести какой-нибудь пример с дочерними узлами??? Как я могу обработать процедуру с большим количеством дочерних узлов подуровня??