gpt4 book ai didi

mysql - 如何使用 VB.NET treeview 从 MySQL 作为数据库创建 TreeView

转载 作者:搜寻专家 更新时间:2023-10-30 22:09:04 26 4
gpt4 key购买 nike

我一直在尝试用代码解决这个问题,但直到现在我都不知道如何获得正确的结果这是我的表

+--------+-----------+----------+
| id | name | node_id |
+--------+-----------+-----------
| 1 | Color | NULL |
| 2 | Black | 1 |
| 3 | Red | 1 |
| 4 | White | 1 |
| 5 | Animal | NULL |
| 6 | Dog | 5 |
| 7 | Cat | 5 |
+--------+-----------+----------+

我想像这样在 TreeView 中的表单中显示它,但正如我所料,它被搞砸了。 Color,Animal为父节点,Black,White,Dog,Cat为子节点

Color
|-Black
|-Red
Animal
|-Dog
|-Cat

这是使用 VB.NET 的 TreeView 代码:

'select the min Id as the starting of node
Dim SQL As String = "select min(node_id), name from mytable;"
Dim cmd As MySqlCommand = New MySqlCommand(SQL, cn)
cmd.ExecuteNonQuery()
Dim reader As MySqlDataReader = cmd.ExecuteReader()
Dim id As Integer
Dim name As String
Dim node1, node2 As TreeNode

While reader.Read
id = reader.GetString(0)
name = reader.GetString(1)
End While

reader.Close()
cmd.CommandText = "select id, name from mytable"
cmd.ExecuteNonQuery()
Dim ds As New DataSet
Dim da As New MySqlDataAdapter
'add the first find of min id = name
node1 = TreeView1.Nodes.Add(id, name)
If node1 is Nothing Then
node2 = TreeView1.Nodes.Add(id, name)
Else
node2 = node1.Nodes.Add(id, name)
End If
Dim dr = cmd.ExecuteReader

Do While dr.Read()
TreeView1.Nodes.Add(dr("id"), dr("name"))
TreeView1.Nodes(node2.Level).Nodes.Add(dr("id"), dr("name"))
Loop
dr.Close()

最佳答案

与其引用同一表中其他行的行来标识父项,然后通过多个查询来解开它,您的数据库应该有 2 个表,因为有 2 个参与者:父节点/项和子项/节点相关他们每个人。然而,SO 更多的是分发鱼,而不是钓鱼竿,因为我们可以将表格连接到自身以获得相同的结果,所以这应该可行。

Dim SQL = <sql>SELECT p.Name As Parent, tvnode.Name
FROM tvnode p
LEFT JOIN tvnode
ON tvnode.ParentId = p.Id
WHERE p.ParentId Is null
ORDER BY p.Name;
</sql>.Value

Using dbcon As New MySqlConnection(MySQLConnStr)
Using cmd As New MySqlCommand(SQL, dbcon)

dbcon.Open()
Using rdr As MySqlDataReader = cmd.ExecuteReader
Dim parentName As String = ""
While rdr.Read
Dim nodeName = rdr.GetString("Parent")
' add new parent
If nodeName <> parentName Then
tv1.Nodes.Add(nodeName, nodeName)
parentName = nodeName
End If
' add non null child names
If rdr.IsDBNull(rdr.GetOrdinal("Name")) = False Then
Dim thisname = rdr.GetString("Name")
tv1.Nodes(parentName).Nodes.Add(thisname, thisname)
End If
End While
End Using

End Using
End Using

我为 SQL 使用了 XML 文字只是为了避免滚动,不要让它丢给你。SQL 将 tvnodes 连接到自身,因此它可以使用 p 别名提供父名称(Animal、Color);并在一个查询中为每个子名称提供子名称。

SQL 按 ParentName 对结果进行排序,以便每当该值更改时,你知道你需要添加一个新的根/父节点。因此,无需搜索、检查或运行新查询;不需要 DataSetDataAdapterDataGridView。通过按顺序排列数据,您可以通过阅读器循环。

即使没有子项(“Snack”),这个特定的 JOIN 也会提供父项名称,但这需要代码检查每个子项名称是否不是 DbNull。代码不需要 ID,因此将它们排除在外。

+-----------------------
| Parent | Name
| Animal | Cat
| Animal | Dog
| ...
| Color | Red
| ...
| Color | Purple
| Fish | Perch
| Fish | Bass
|...
| Snack | NULL

结果:

enter image description here

要了解有关 SQL 的更多信息 SQL Tutorial非常好。

关于mysql - 如何使用 VB.NET treeview 从 MySQL 作为数据库创建 TreeView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37616416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com