如何动态生成treeview

wo8352490123 2009-08-18 03:29:16
有这样一张表 FORMID FORMID_LAST ISROOT
0
1 0
11 1
12 1
111 11 1
112 11 1
2 0
21 2
22 2
211 21 1
212 21 1

FORMID为“0”说明它是根节点,然后根据FORMID_LAST判断是谁的子节点(如FORMID_LAST值为0时,它对应的FORMID就是
FORMID为0的子节点;FORMID_LAST为11时,它对应的FORMID就是FORMID为11的子节点),ISROOT值为1时表示它没有子节点了,
不需要查询了,有就要再查询子节点。
希望哪位达人能为我编程实现,由于节点数目不确定,所以不怎么好用循环,据说可以用递归,先感谢了!
...全文
118 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
LYDF4151 2009-08-19
  • 打赏
  • 举报
回复
这种情况最好使用递归来遍历整个表,因为你不知道有多少层。
gba8jing 2009-08-18
  • 打赏
  • 举报
回复
http://hi.baidu.com/gba8jing 里面有现成的 3 层 结构,数据库直读自动生成树型结构源码。还能成品打包下载

开发环境要 vs2008

在 CanPower 智能商品管理 1.0 版的树型结构源码公开! 详细这篇文章里。
xunis 2009-08-18
  • 打赏
  • 举报
回复

''' <summary>
''' 加载主节点
''' </summary>
''' <remarks></remarks>
Private Sub LoadTreeView()
Dim strSQL As String = "select * from Departments"
Dim ds As DataSet = GetDataSet(strSQL)
Dim dt As DataTable = ds.Tables(0)
'Dim dtTable As DataTable = dtSet.Tables(0)
Dim i As Integer
'遍历所有的数据
For i = 0 To dt.Rows.Count - 1
'寻找主节点 A
If dt.Rows(i).Item("PDepID") = "A" Then
Dim tNode As New TreeNode
'给主节点赋名字
tNode.Name = dt.Rows(i).Item("DepID")
tNode.Text = dt.Rows(i).Item("DepName")
'将主节点加载到树上
Me.trvData.Nodes.Add(tNode)
'调用加载子节点方法 将所有的子节点加载到主节点下
LoadSubTree(dt, tNode)
tNode = Nothing
End If
Next
End Sub

''' <summary>
''' 加载子节点
''' </summary>
''' <param name="dtTable"></param>
''' <param name="tNode"></param>
''' <remarks></remarks>
Private Sub LoadSubTree(ByVal dtTable As DataTable, ByVal tNode As TreeNode)
Dim i As Integer
'遍历所有的数据
For i = 0 To dtTable.Rows.Count - 1
'寻找主节点
If tNode.Name = dtTable.Rows(i).Item("PDepID") Then
Dim sNode As New TreeNode
'给子节点赋名字
sNode.Name = dtTable.Rows(i).Item("DepID")
sNode.Text = dtTable.Rows(i).Item("DepName")
'将子节点加载到主节点上
tNode.Nodes.Add(sNode)
'递归调用 自己调用自己加载全部子节点
LoadSubTree(dtTable, sNode)
sNode = Nothing
End If
Next
End Sub

''' <summary>
''' 树形菜单查询
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub trvData_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles trvData.AfterSelect
'清空输入区
btnClear_Click(sender, e)
Dim tNode As New TreeNode
Dim sNode As New TreeNode
Dim strSQL As String = ""
'校驗密碼和用戶名的SQL語句
Try
strSQL = "SELECT * FROM VWEmployees WHERE DepID like '%" & trvData.SelectedNode.Name & "%' order by EmpID"
Dim ds As DataSet = GetDataSet(strSQL)
If ds.Tables.Item(0).Rows.Count = 0 Then
MessageBox.Show("资料不存在")
Else
'显示数据
Me.dgvShowData.DataSource = ds.Tables.Item(0).DefaultView
'中文标题
chineseTitle()
End If
Catch ex As Exception
MessageBox.Show("GetEmployee出错!")
End Try
End Sub
taick 2009-08-18
  • 打赏
  • 举报
回复
可以这样
先select FORMID_LAST为null的数据
然后 for each 1
在里面建节点
再select FORMID_LAST=FORMID
for each 2
建子节点
next 2
next 1

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧