vb.net中treeview控件用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb.net中treeview控件用法相关的知识,希望对你有一定的参考价值。
我用的是C/S结构,做初学者的课题“管理系统”增删查改,自己想多弄的别的。
目的是选中某个节点后连接到制定位置,或者执行其他代码。
如图片所示,想要选中“个人信息”后,显示左边的TabControl。选中其他的就显示别的。我是个初学者,很多不懂,希望高手指点。
谢绝问度娘然后负责黏贴,因为我也会
可以在树节点旁显示图像,方法是将一个 ImageList 分配给 ImageList 属性,然后通过引用 Image 在 ImageList 中的索引值来分配该 Image。使用下面的属性分配图像:
将 ImageIndex 属性设置为当树节点未选定时所显示的 Image 的索引值。
将 SelectedImageIndex 属性设置为当树节点被选定时要显示的 Image 的索引值。
ImageIndex 和 SelectedImageIndex 属性值所引用的图像是所有分配给 Nodes 集合的树节点显示的默认图像。每个树节点都可以通过设置 TreeNode.ImageIndex 和 TreeNode.SelectedImageIndex 属性来取代默认的图像。
树节点可以展开,以显示下一级子树节点。用户可以在 TreeNode 旁显示加号 (+) 按钮时通过单击加号 (+) 按钮来展开 TreeNode,或者可以通过调用 TreeNode.Expand 方法来展开 TreeNode。若要展开 Nodes 集合中的所有子树节点级别,请调用 ExpandAll 方法。若要折叠子 TreeNode 级别,可以调用 TreeNode.Collapse 方法,也可以在 TreeNode 旁显示减号 (-) 按钮时按减号 (-) 按钮。还可以通过调用 TreeNode.Toggle 方法在展开和折叠状态之间切换。
树节点可以选择性地显示复选框。若要显示复选框,请将 TreeView 的 CheckBoxes 属性设置为 true。对于处于选中状态的树节点,Checked 属性设置为 true。
注意
从 BeforeCheck 或 AfterCheck 事件内设置 TreeNode.Checked 属性将导致该事件被多次引发并可能产生意外行为。例如,您可以在递归更新子节点时在事件处理程序中设置 Checked 属性,以便用户不必逐个展开并选中每个节点。如果未将 TreeViewEventArgs 的 Action 属性设置为 TreeViewAction.Unknown,则若要防止该事件被多次引发,需为仅执行递归代码的事件处理程序添加逻辑。有关如何进行此操作的示例,请参见 AfterCheck 或 BeforeCheck 事件的示例部分。
通过设置 TreeView 控件的一些显示和样式属性,可以更改此控件的外观。如果将 ShowPlusMinus 设置为 true,则会分别在每个可展开或折叠的 TreeNode 旁显示加号或减号按钮。如果将 ShowRootLines 属性设置为 true,TreeView 则会显示联接所有根树节点之间的连线。通过将 ShowLines 属性设置为 true,可以显示子树节点与其根节点之间的连线。如果将 HotTracking 属性设置为 true,那么当鼠标指针移过树节点标签时,树节点标签的外观将发生变化。如果启用热跟踪,树节点标签将具有超链接的外观。也可以完全自定义 TreeView 控件的外观。若要执行此操作,请将 DrawMode 属性设置为 TreeViewDrawMode.Normal 以外的值并处理 DrawNode 事件。
注意
在运行时设置 CheckBoxes、Scrollable、ImageIndex 和 SelectedImageIndex 属性时,将重新创建 TreeView 句柄(请参见 Control.RecreateHandle)以更新控件的外观。这将折叠除选定的 TreeNode 之外的所有树节点。
下面的代码示例阐释了如何使用 TreeView 控件。
Private Sub InitializeTreeView()
treeView1.BeginUpdate()
treeView1.Nodes.Add("Parent")
treeView1.Nodes(0).Nodes.Add("Child 1")
treeView1.Nodes(0).Nodes.Add("Child 2")
treeView1.Nodes(0).Nodes(1).Nodes.Add("Grandchild")
treeView1.Nodes(0).Nodes(1).Nodes(0).Nodes.Add("Great Grandchild")
treeView1.EndUpdate()
End Sub
From MSDN 参考技术A 由于每个 TreeNode 都可以包含其他 TreeNode 对象的集合,您可能会在循环访问集合时觉得很难确定自己在树结构中的位置。您可以使用 PathSeparator 字符串值来分析 TreeNode.FullPath 字符串,以确定 TreeNode 标签的起始和终止位置。
可以在树节点旁显示图像,方法是将一个 ImageList 分配给 ImageList 属性,然后通过引用 Image 在 ImageList 中的索引值来分配该 Image。使用下面的属性分配图像:
将 ImageIndex 属性设置为当树节点未选定时所显示的 Image 的索引值。
将 SelectedImageIndex 属性设置为当树节点被选定时要显示的 Image 的索引值。
ImageIndex 和 SelectedImageIndex 属性值所引用的图像是所有分配给 Nodes 集合的树节点显示的默认图像。每个树节点都可以通过设置 TreeNode.ImageIndex 和 TreeNode.SelectedImageIndex 属性来取代默认的图像。
树节点可以展开,以显示下一级子树节点。用户可以在 TreeNode 旁显示加号 (+) 按钮时通过单击加号 (+) 按钮来展开 TreeNode,或者可以通过调用 TreeNode.Expand 方法来展开 TreeNode。若要展开 Nodes 集合中的所有子树节点级别,请调用 ExpandAll 方法。若要折叠子 TreeNode 级别,可以调用 TreeNode.Collapse 方法,也可以在 TreeNode 旁显示减号 (-) 按钮时按减号 (-) 按钮。还可以通过调用 TreeNode.Toggle 方法在展开和折叠状态之间切换。
树节点可以选择性地显示复选框。若要显示复选框,请将 TreeView 的 CheckBoxes 属性设置为 true。对于处于选中状态的树节点,Checked 属性设置为 true。
注意
从 BeforeCheck 或 AfterCheck 事件内设置 TreeNode.Checked 属性将导致该事件被多次引发并可能产生意外行为。例如,您可以在递归更新子节点时在事件处理程序中设置 Checked 属性,以便用户不必逐个展开并选中每个节点。如果未将 TreeViewEventArgs 的 Action 属性设置为 TreeViewAction.Unknown,则若要防止该事件被多次引发,需为仅执行递归代码的事件处理程序添加逻辑。有关如何进行此操作的示例,请参见 AfterCheck 或 BeforeCheck 事件的示例部分。
通过设置 TreeView 控件的一些显示和样式属性,可以更改此控件的外观。如果将 ShowPlusMinus 设置为 true,则会分别在每个可展开或折叠的 TreeNode 旁显示加号或减号按钮。如果将 ShowRootLines 属性设置为 true,TreeView 则会显示联接所有根树节点之间的连线。通过将 ShowLines 属性设置为 true,可以显示子树节点与其根节点之间的连线。如果将 HotTracking 属性设置为 true,那么当鼠标指针移过树节点标签时,树节点标签的外观将发生变化。如果启用热跟踪,树节点标签将具有超链接的外观。也可以完全自定义 TreeView 控件的外观。若要执行此操作,请将 DrawMode 属性设置为 TreeViewDrawMode.Normal 以外的值并处理 DrawNode 事件。
注意
在运行时设置 CheckBoxes、Scrollable、ImageIndex 和 SelectedImageIndex 属性时,将重新创建 TreeView 句柄(请参见 Control.RecreateHandle)以更新控件的外观。这将折叠除选定的 TreeNode 之外的所有树节点。
下面的代码示例阐释了如何使用 TreeView 控件。
Private Sub InitializeTreeView()
treeView1.BeginUpdate()
treeView1.Nodes.Add("Parent")
treeView1.Nodes(0).Nodes.Add("Child 1")
treeView1.Nodes(0).Nodes.Add("Child 2")
treeView1.Nodes(0).Nodes(1).Nodes.Add("Grandchild")
treeView1.Nodes(0).Nodes(1).Nodes(0).Nodes.Add("Great Grandchild")
treeView1.EndUpdate()
End Sub
From MSDN 参考技术B 最简单的学习方法,手动添加treeview,并添加ITEM,然后看生成的代码本回答被提问者采纳
已经添加了具有相同键 TREEVIEW vb.net 和 sql server 的项目
【中文标题】已经添加了具有相同键 TREEVIEW vb.net 和 sql server 的项目【英文标题】:with already added an item with the same key TREEVIEW vb.net and sql server 【发布时间】:2021-04-05 15:49:59 【问题描述】:我有这个错误,我不确定是什么原因造成的:
已添加具有相同键的元素
我在树形视图中显示数据如下:DEPARTMENT / PROVINCE / DISTRICT 用 Visual Basic 制作的附件代码:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim conexaoSQLServer As SqlConnection = Nothing
Dim cmd As SqlCommand
Dim da As New SqlDataAdapter
Dim ds As New DataSet
Dim strCon As String = "Data Source = SOPORTE-ERP\SQLEXPRESS; Initial Catalog = prueba; Integrated Security = True"
'define a consulta para obter as tabelas e suas colunas
Dim sqlConsulta As String = "SELECT DESCRIPCION AS nodeText,'DEPA' + CAST(IDDEPARTAMENTO AS VARCHAR) AS nodeKey,''AS nodeParentKey FROM DEPARTAMENTO " +
"UNION ALL SELECT DESCRIPCION AS nodeText,'PROV' + CAST(IDPROVINCIA AS VARCHAR) AS nodeKey,'DEPA' + CAST(IDDEPARTAMENTO AS VARCHAR) AS nodeParentKey " +
"FROM PROVINCIAS UNION SELECT DESCRIPCION AS nodeText,'DIST' + CAST(IDUBIGEO AS VARCHAR) AS nodeKey," +
"'PROV' + CAST(IDPROVINCIA AS VARCHAR) AS nodeParentKey FROM UBIGEO"
Try
'define e abre a conexão com o SQL Server
conexaoSQLServer = New SqlConnection(strCon)
conexaoSQLServer.Open()
'atribui o comando usado na conexão
cmd = New SqlCommand(sqlConsulta, conexaoSQLServer)
da.SelectCommand = cmd
'preenche o dataset
da.Fill(ds, "DATOS_SISTEMAS")
'Helper dictionaries
Dim nodes2 As New Dictionary(Of String, TreeNode) 'Holds the nodes based on their key values
Dim nodeParents As New Dictionary(Of String, String) 'Holds the parent keys of child nodes
'Create nodes from data
For Each row As DataRow In ds.Tables("DATOS_SISTEMAS").Rows
Dim nodeText2 As String = row.Field(Of String)("nodeText")
Dim nodeKey2 As String = row.Field(Of String)("nodeKey")
Dim nodeParentKey2 As String = row.Field(Of String)("nodeParentKey")
nodes2.Add(nodeKey2, New TreeNode(nodeText2))
If Not String.IsNullOrEmpty(nodeParentKey2) Then
nodeParents.Add(nodeKey2, nodeParentKey2)
End If
Next
'Add nodes to treeview (and resolve parents)
For Each kvp In nodes2
Dim node1 As TreeNode = kvp.Value
Dim nodeKeys1 As String = kvp.Key
Dim nodeParentKeys1 As String = Nothing
If nodeParents.TryGetValue(nodeKeys1, nodeParentKeys1) Then
'Child node
Dim parentNode As TreeNode = nodes2(nodeParentKeys1)
parentNode.Nodes.Add(node1)
Else
'Root node
TreeView1.Nodes.Add(node1)
End If
Next
Catch ex As Exception
MessageBox.Show("error when performing this operation: " & ex.Message)
Exit Sub
Finally
'libera os recursos da conexão usada
conexaoSQLServer.Close()
conexaoSQLServer.Dispose()
conexaoSQLServer = Nothing
End Try
End Sub
我验证了每个表的 ID 字段都是唯一的并且是自动递增的。这似乎是字典的错误。我做错了什么?
【问题讨论】:
调用.Close()
、.Dispose()
并设置为 Nothing
是从 vb6/vbscript 时代遗留下来的,不再需要或没有帮助,并且在极少数情况下可能会产生积极的危害. .Dispose()
对 VB.Net 来说就足够了
假设您已经单步执行了代码并查看了断点或错误处的错误值,那么有问题的值是什么?错误发生在哪一行? nodes2.Add(nodeKey2, New TreeNode(nodeText2))
? parentNode.Nodes.Add(node1)
?请提供更详细的信息。
【参考方案1】:
我怀疑缺少Tree1.Nodes.Clear()
是主要问题,但可能还有其他问题,问题是缺少一些重要信息(数据!),并且代码以过时的风格编写。结果是我不得不进行现代化改造,因为我去寻找这么多东西,我可能仍然遗漏了一些东西。见下文,并记下我添加的表扬:
'Separate DB access from event code!
Friend Module DB
Private connectString As String = "Data Source = SOPORTE-ERP\SQLEXPRESS; Initial Catalog = prueba; Integrated Security = True"
Public Function GetTreeNodeData() As DataTable
'multi-line string literals work now
Dim sql As String = "
SELECT *
FROM (
SELECT DESCRIPCION AS nodeText,'DEPA' + CAST(IDDEPARTAMENTO AS VARCHAR) AS nodeKey,''AS nodeParentKey
FROM DEPARTAMENTO
UNION ALL
SELECT DESCRIPCION AS nodeText,'PROV' + CAST(IDPROVINCIA AS VARCHAR) AS nodeKey,'DEPA' + CAST(IDDEPARTAMENTO AS VARCHAR) AS nodeParentKey
FROM PROVINCIAS
UNION
SELECT DESCRIPCION AS nodeText,'DIST' + CAST(IDUBIGEO AS VARCHAR) AS nodeKey,'PROV' + CAST(IDPROVINCIA AS VARCHAR) AS nodeParentKey
FROM UBIGEO
) t
ORDER BY t.NodeParentKey, t.NodeKey, t.NodeText"
Dim ds As New DataSet
Using cn As New SqlConnection(connectString), _
cmd As New SqlCommand(sql, cn), _
da As New SqlDataAdapter(cmd)
'preenche o dataset
da.Fill(ds, "DATOS_SISTEMAS") '.Fill() opens and closes automatically
End Using 'End Using closes the connection, **even if an exception is thrown!**
Return ds.Tables("DATOS_SISTEMAS")
End Function
End Module
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Limit the scope of each try/catch, so the error message can be more meaningful/helpful
Dim nodeRecords As DataTable
Try
'Create nodes from data
nodeRecords = DB.GetTreeNodeData()
Catch ex As Exception
MessageBox.Show($"Error performing database operation:vbCrLfex.Message")
Exit Sub
End Try
Dim nodes As New Dictionary(Of String, TreeNode)
Try
For Each row As DataRow In nodeRecords.Rows
Dim nodeKey As String = row.Field(Of String)("nodeKey")
Dim nodeText As String = row.Field(Of String)("nodeText")
Dim parentKey As String = row.Field(Of String)("nodeParentKey")
If Not nodes.ContainsKey(parentKey) Then
nodes.Add(parentKey, new TreeNode())
End If
If nodes.ContainsKey(nodeKey) Then
nodes(nodeKey).Text = nodeText
nodes(parentKey).Nodes.Add(nodes(nodeKey)) 'we know the parent exists, because we just created it if it was missing
Else
Dim node As New TreeNode(nodeText)
nodes(parentKey).Nodes.Add(node)
nodes.Add(nodeKey, node)
End If
Next row
Catch ex As Exception
MessageBox.Show($"Error building tree:vbCrLfex.Message")
Exit Sub
End Try
TreeView1.SuspendLayout() 'suspend/resume layout avoids flickering as control is updated
TreeView1.Nodes.Clear() 'I suspect missing this is your main problem
For Each kvp As KeyValuePair(Of String, TreeNode) In nodes.Where(Function (n) n.Parent Is Nothing)
TreeView1.Nodes.Add(node1)
Next kvp
TreeView1.ResumeLayout()
End Sub
【讨论】:
您好,亲爱的,我在这一行有 2 个错误:nodes (nodeKey) .Parent = nodes (parentKey) ----- 告诉我“Parent 属性是 ReadOnly”,另一个在这部分:在 nodes.Where (Function (n) n. Parent is nothing) - 重载解析错误,因为没有“Where”函数 第二次,确保您在顶部有一个Imports System.Linq
。
好的,已更新以修复第一个问题。以上是关于vb.net中treeview控件用法的主要内容,如果未能解决你的问题,请参考以下文章