我成功编码以填充两级树视图对象,如下所示:
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"
但是我没有成功。
我发布了修改的原始代码。
请让我查看您修改后的代码以创建三级树视图。
有很多事情你应该改变。首先,正如评论中所建议的,您应该对结果进行排序。这样,您就知道特定列中所有相同的值都将被分组。您也不应该在创建节点时将它们添加到树中。每当您为这样的控件创建多个项目时,您的第一个选择应该是先创建项目,然后最后将它们全部添加到一批中。这是做你想做的事情的一种选择:
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