一个关于treeview的难题,高人一定要进来!
在一个窗体中包含两个treeview控件。一个treeview控件的内容通过递归算法从一个表中取得,第二个控件的内容根据用户在第一个控件中选择的内容确定。
表名为cdqj(菜单全集)表结构如下:
id(序号): 主键,自增字段
cc(层次): varchar,每两位代表一个层次,每个层次可能包括多个子层次
ccmc(层次名称): varchar
bleaf(是否为叶节点): bit
示例数据
序号 层次 名称 叶节点
1 01 dotNet图书 否
2 0101 Asp.net 是
3 0102 VB.Net 否
4 010201 WinForm(VB) 是
5 010202 WebForm(VB 是
6 0103 C# 否
7 010301 WinForm(C#) 是
8 010302 WebForm(C#) 是
通过递归算法treeview1的内容如下
+根节点
|--dotNet图书
|--Asp.Net
|--VB.Net
|--WinForm(VB)
|--WebForm(VB)
|--C#
|--WinForm(C#)
|--WebForm(C#)
1.此时当用户双击WinForm(VB)节点时,须完成如下功能
treeview2由初始状态
+根节点
自动变为
+根节点
|--dotNet图书
|--VB.Net
|--WinForm(VB)
2.此时若用户继续双击treeview1中的WinForm(VB)节点时,treeview2应保持内容不变化
3.若此时用户双击treeview1中的C#节点时,treeview2应该变为
+根节点
|--dotNet图书
|--VB.Net
|--WinForm(VB)
|--C#
|--WinForm(C#)
|--WebForm(C#)
总结:当用户在treeview1中双击叶节点时,需要将该叶节点以及该叶节点的所有父节点加入到treeview2中(当然,父节点不能被重复加入,如例2);当用户在treeview1中双击非叶节点时,该节点的所有子节点和父节点均应加入treeview2中(如例三)。
我看了一下论坛中有关treeview的问题,大都集中在如何处理一个treeview控件的问题,有那位高人能够实现以上有关两个treeview控件的算法,本人将不胜感激。
附件:填充treeview1的递归算法
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
If Not IsPostBack Then
Me.FillTreeView()
End If
End Sub
Private Sub FillTreeView()
Dim root As New TreeNode()
root.Text = "根节点"
root.ImageUrl = "./images/bs.gif"
root.ExpandedImageUrl = "./images/bo.gif"
Me.tvGNQJ.Nodes.Add(root)
Me.tvGNQJ.ExpandLevel = 1
'通过递归算法填写treeview
GetChild(2, "*", root.Nodes)
End Sub
'递归调用,填充Treeview
'ccLength --子节点层次字段长度
'strPatten --父节点层次字段内容
'nodes --节点集合
Private Sub GetChild(ByVal ccLength As Integer, ByVal strPatten As String, ByVal nodes As TreeNodeCollection)
Dim cn As OleDbConnection
Dim cm As OleDbCommand
Dim strSql As String
Dim dr As OleDbDataReader
Static Dim i As Integer
cn = New OleDbConnection(ConfigurationSettings.AppSettings("cnstr"))
cn.Open()
If i = 0 Then
'第一次进入的语句
strSql = "select * from cdqj where len(cc)=" & ccLength
i += 1
Else
'以后进入的语句
'父节点层次长度
Dim pLength As Integer
pLength = ccLength - 2
strSql = "select * from cdqj where len(cc)=" & ccLength & " and left(cc," & pLength & ")=" & strPatten
End If
cm = New OleDbCommand(strSql, cn)
dr = cm.ExecuteReader()
While dr.Read
Dim node As New TreeNode()
node.Text = dr("ccmc")
'是否为叶节点
If dr("bleaf") Then
'是
node.ImageUrl = "./images/dc.gif"
Else
'否
node.ImageUrl = "./images/bs.gif"
node.ExpandedImageUrl = "./images/bo.gif"
End If
'将当前节点加入节点集合
nodes.Add(node)
'递归调用
GetChild(ccLength + 2, dr("cc"), node.Nodes)
End While
cn.Close()
End Sub
问题点数:100、回复次数:7Top
1 楼sheyanfen(星宇)回复于 2002-10-04 08:48:26 得分 1
1、生成第一个TreeView
2、点击第一个TreeView时,动态生成第二个TreeView,只要取得当前点击节点的父及子,然后将它们添加到第二个TreeView中,就可以实现你所说的操作了。Top
2 楼chinapro(Nothing But VB.Net)回复于 2002-10-04 11:05:32 得分 0
能否再具体一点?谢了!Top
3 楼zhaixd()回复于 2002-10-04 16:36:41 得分 59
你的算法效率不高,应该使用数据集,这样可以避免递归调用时查询数据库
生成第一个树是由父节点到子节点进行递归
生成第二个树可由子节点到父节点进行递归
Top
4 楼chinapro(Nothing But VB.Net)回复于 2002-10-05 20:27:49 得分 0
zhaixd谢谢,我也意识到应该用dataset来做。能否指出如何获得当前节点的父节点?Top
5 楼chinapro(Nothing But VB.Net)回复于 2002-10-08 09:05:19 得分 0
问题还没有解决啊!Top
6 楼sheyanfen(星宇)回复于 2002-10-08 09:10:28 得分 40
取得当前节点父节点的Text
((TreeNode)mytree.GetNodeFromIndex(mytree.SelectedNodeIndex).Parent).Text;Top
7 楼chinapro(Nothing But VB.Net)回复于 2002-10-08 09:14:47 得分 0
Thanks!,sheyanfen.但是如何解决两个treeview之间移动node的问题呢?Top




