实例分析VB.NET Treeview结构

    这里介绍VB.NET Treeview结构,Treeview是由节点TreeNode组成的,第一级的称之为根节点TreeRoot,在根节点之下一级的称之为某个根节点的子节点TreeLeaf,某个子节点之下一级的子节点就称为该子节点的子节点。

本人很喜欢VB.NET,在工作中也很喜欢总结关于VB.NET Treeview结构的经验教训,我们简单分析一下VB.NET Treeview结构(笔者准备在另文专门剖析一下VB.NET Treeview结构,以方便有兴趣的网友进行高级应用)

Treeview是由节点TreeNode组成的,第一级的称之为根节点TreeRoot,在根节点之下一级的称之为某个根节点的子节点 TreeLeaf,某个子节点之下一级的子节点就称为该子节点的子节点。第个节点有两个标识方式,一个是它的Text,即显示出来的内容;另一个是它的 Tag属性,一般用唯一标识码对其进行标识,以用于在使用时对节点的识别。在本文中,也主要用Text属性来显示节点的名称字段,用Tag属性来显示节点 的编号属性。(节点编号被设为主键,也就是唯一的标识了)

1.加载根节点

好了,我们该开始在VB.NET中进行演练了!第一步,当然是看看怎么在窗体起始的时候加载根节点:

  1. \'定义公用变量
  2. Dim myconnection As New OleDb.OleDbConnection()
  3. Dim MyAdapater As New OleDb.OleDbDataAdapter()
  4. Dim mycommand As New OleDb.OleDbCommand()
  5. Dim ds As New DataSet()
  6. Private Sub Form1_Load(ByVal sender As System.Object,

    ByVal e As System.EventArgs) Handles MyBase.Load

  7. \'载入根节点表至treeview中,作为第一级
  8. myconnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
  9. Data Source=" & Application.StartupPath & "\project.mdb"
  10. \'数据库连接请自行更换
  11. mycommand.CommandText = "SELECT 根节点编号,根节点名称 FROM 根节点"
  12. mycommand.Connection = myconnection
  13. Try
  14. myconnection.Close()
  15. myconnection.Open()
  16. Dim mysqlreader As OleDb.OleDbDataReader = mycommand.ExecuteReader
  17. TreeView1.Nodes.Clear()
  18. While mysqlreader.Read()
  19. Dim tree_root As New TreeNode()
  20. tree_root.Tag = mysqlreader.GetString(0)
  21. \'把编号放入tag中
  22. tree_root.Text = mysqlreader.GetString(1)
  23. \'树上显示的是根节点名称
  24. \'请根据你数据库字段的类型来决定是否用getstring或其它类型
  25. TreeView1.Nodes.Add(tree_root)
  26. End While
  27. Catch ex As Exception
  28. MessageBox.Show(ex.ToString, "数据表根节点载入错误", vbOKOnly)
  29. Finally
  30. myconnection.Close()
  31. End Try
  32. TreeView1.ExpandAll()
  33. TreeView1.Select()
  34. End Sub

2.点击时加入子节点

对TreeView的点击,对于TreeView控件本身,并没有为哪一个级别的 Node编写点击(选择)事件处理程序,而是把所有节点的点击事件都写入了一个AfterSelect事件中。因此,在编写点击加入子节点的程序之前,我 们还必须编写一个查找点击的节点是哪一级节点的方法。

  1. Public Function NodeLevel(ByVal n As TreeNode) As Byte
  2. \'* 找出树中当前节点的级数
  3. Dim i As Byte = 1
  4. Dim m As String
  5. Do Until n.Parent Is Nothing
  6. nn = n.Parent
  7. i += 1
  8. Loop
  9. Return i
  10. End Function

通过这个函数,就可以很方便地得到节点的级别。现在我们可以放心地编写节点选择事件处理程序,以实现动态加载各级节点的子节点。

  1. Private Sub TreeView1_AfterSelect(ByVal sender As System.Object,

    ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect

  2. Select Case NodeLevel(e.Node).ToString
  3. Case "1"
  4. If e.Node.GetNodeCount(False) = 0 Then
  5. mycommand.CommandText = "select 第一级子节点编号,第一级子节点名称

    from 第一级子节点 where 根节点编号 =\'" & e.Node.Tag & "\'"

  6. fill_treeleaf()
  7. End If
  8. Case "2"
  9. If e.Node.GetNodeCount(False) = 0 Then
  10. mycommand.CommandText = "select 第二级子节点编号,第二级子节点名称

    from 第二级子节点 where 第一级子节点编号 =\'" & e.Node.Tag & "\'"

  11. fill_treeleaf()
  12. End If
  13. End Select
  14. End Sub
  15. Public Sub fill_treeleaf()
  16. mycommand.Connection = myconnection
  17. Try
  18. myconnection.Open()
  19. Dim mysqlreader As OleDb.OleDbDataReader = mycommand.ExecuteReader
  20. While mysqlreader.Read()
  21. Dim tree_leaf As New TreeNode()
  22. tree_leaf.Tag = mysqlreader.GetString(0)
  23. tree_leaf.Text = mysqlreader.GetString(1)
  24. TreeView1.SelectedNode.Nodes.Add(tree_leaf)
  25. End While
  26. Catch ex As Exception
  27. MsgBox(ex.Message)
  28. Finally
  29. myconnection.Close()
  30. End Try
  31. End Sub