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