开始,从数据中读取数据这个数据就不用说了吧,虽然是学C#的,不过公司要求要用VB来编写,代码附上:
Public Sub BindTree(ByVal tnAs TreeNode)
Dim strAs String = tn.Tag(1)
DimmyConn As SqlConnection = db.getConnection() '得到数据库的链接
Dimtable As DataTable = db.GetSonNode(str, myConn)'由数据库帮助类得到子节点
Iftable.Rows.Count = 0 Then
tn.ImageIndex = 0
Return
End If
Forindex As Integer= 0 To table.Rows.Count - 1
Dimnode As NewTreeNode
node.Text = table.Rows(index)("编码").ToString()
node.Name = table.Rows(index)("序号").ToString()
node.Tag = table.Rows(index)
node.ImageIndex = 1
tn.Nodes.Add(node)
Iftable.Rows(index)("父编码").ToString().Length = 0 Then
Return
Else
BindTree(node)
EndIf
Next
End Sub
这是在下编写的递归算法,当然这是一个很常见的递归算法,相信大家都很容易理解,也易懂,不过如果各位有更好的想法的话,不如一起交流交流也不错啊,呵呵···就当抛砖引玉了。
不过此次对TreeView的操作里面,这当然不是关键,有一个关键的地方就是开始经理和我说的那个,如何去实现凡是带子节点的节点和没有子节点的节点的图标不一致的问题。
开始,我只是单纯的初始化设置了node.ImageIndex为1或者为0,不过后来发现,在点击控件的时候,你看不到ImageIndex的改变,却在控件中的显示中悄悄的发生了变化,开始有点不懂,后来才知道,选择的节点必须经过另一项设置之后才会使其保持不变,就是在节点选择后的事件中添加以下这样一条语句:TreeView1.SelectedNode.SelectedImageIndex = 1,这样才能保持图标的不变。
关键点二:我们只知道遍历循环整个树,就是从数据库中读取整个数据表,然后进行遍历。那么如何在已有的树形结构中对某一个节点进行遍历得到其所有子节点呢?注意是所有子节点,所以在此又要写一个遍历算法。(当然只是我只想到了这样一个办法,肯定有更优解,代码如下:)
If tnode.Nodes.Count = 0 Then
Return
End If
Dim table AsDataTable
Dim str AsString = tnode.Tag(1)
Dim myConn AsSqlConnection = db.getConnection()
table = db.GetSonNode(str, myConn)
mydataset.Tables.Add(table)
For i AsInteger = 0 Totnode.Nodes.Count - 1
GetAllSonNode(tnode.Nodes(i))
Next
|