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