通过 SQL Server 表 VB.NET 代码填充三级树视图

问题描述 投票:0回答:1

我成功编码以填充两级树视图对象,如下所示:

Dim query As String = "SELECT GrandLedgers, Ledgers FROM TrvBook WHERE ID = @OwnerID"

Using con = New SqlConnection(ConString)
    Using cmd = New SqlCommand(query, con)
        cmd.Parameters.Add(New SqlParameter("@OwnerID", My.Settings.OwnerID))

        con.Open()

        Dim dt As SqlDataReader = cmd.ExecuteReader
        Dim gl, l As String
        Dim name1 As String = ""

        While dt.Read
            Dim node1 As New TreeNode
            gl = dt.Item(0).ToString
            l = dt.Item(1).ToString

            If name1 = gl Then
                TreeViewBook.SelectedNode.Nodes.Add(0)
            Else
                name1 = gl
                node1 = TreeViewBook.Nodes.Add(gl)
                TreeViewBook.SelectedNode = node1
                TreeViewBook.SelectedNode.Nodes.Add(0)
            End If
        End While
    End Using
End Using

TreeViewBook.ExpandAll()

我尝试使用添加的列

Persons
将第三级添加到此树视图,如以下查询所示:

Dim query As String = "SELECT GrandLedgers, Ledgers, Persons FROM TrvBook WHERE ID = @OwnerID"

但是我没有成功。

我发布了修改的原始代码。

请让我查看您修改后的代码以创建三级树视图。

vb.net treeview
1个回答
0
投票

有很多事情你应该改变。首先,正如评论中所建议的,您应该对结果进行排序。这样,您就知道特定列中所有相同的值都将被分组。您也不应该在创建节点时将它们添加到树中。每当您为这样的控件创建多个项目时,您的第一个选择应该是先创建项目,然后最后将它们全部添加到一批中。这是做你想做的事情的一种选择:

Dim query = "SELECT Column1, Column2, Column3
             FROM Table1 Where Id = @Id
             ORDER BY Columnn1, Column2"
Dim nodes As New List(Of TreeNode)

Using connection As New SqlConnection(connectionString),
      command As New SqlCommand(query, connection)
    command.Parameters.Add("@Id", SqlDbType.Int).Value = id

    Dim parentNode As TreeNode = Nothing
    Dim childNode As TreeNode = Nothing

    Using reader = command.ExecuteReader()
        Dim parent = reader.GetString(reader.GetOrdinal("Column1"))
        Dim child = reader.GetString(reader.GetOrdinal("Column2"))
        Dim grandchild = reader.GetString(reader.GetOrdinal("Column3"))

        If parent <> parentNode?.Text Then
            'Either there is no parent node or the parent value has changed so create a new parent node.
            parentNode = New TreeNode(parent)
            nodes.Add(parentNode)
            childNode = Nothing
        End If

        If child <> childNode?.Text Then
            'Either there is no child node or the child value has changed so create a new child node.
            childNode = New TreeNode(child)
            parentNode.Nodes.Add(childNode)
        End If

        childNode.Nodes.Add(New TreeNode(grandchild))
    End Using
End Using

'Add all nodes to the tree in a single batch.
TreeView1.Nodes.AddRange(nodes.ToArray())

另一个小问题是添加查询参数的方式。这个:

cmd.Parameters.Add(New SqlParameter("@OwnerID", My.Settings.OwnerID))

可以这样写更简洁:

cmd.Parameters.AddWithValue("@OwnerID", My.Settings.OwnerID)

那很糟糕。在这种情况下它可能会起作用,但您依赖于系统从值推断正确的数据类型,并且这并不在所有情况下都起作用。你知道什么情况下它不起作用吗?如果你不这样做,那么你就不必关心。按照我在上面的示例中的方式进行操作,即明确说明数据类型,并且不会出错。对于可变长度数据类型,您也应该指定长度,例如

command.Parameters.Add("@Name", SqlDbType.VarChar, 50).Value = name
© www.soinside.com 2019 - 2024. All rights reserved.