如何读取数据库表记录并填充到treeview控件?(要vb.net版本的)

chxuxu 2005-04-29 11:13:30
我的表结构为:ID,Name,Parent.
其中Parent表示父亲节点,如果是0,则表示跟节点.如果某个记录的Parent等于另一个记录的ID则表示这个记录是另一个记录的子节点,要将他们按照父子节点关系填充到treeview控件.我的代码是这样的:
Private Sub inittree(ByRef Nds As TreeNodeCollection, ByVal parentId As Integer)
conn.Open()
Dim da As New SqlDataAdapter("select * from MJCfgDoorPos", conn)
Dim mySet As New DataSet
da.Fill(mySet, "paybasic")

Dim dv As New DataView()
Dim dvrow As DataRowView
Dim tmpNode As TreeNode
'intId为数值型变量,其作用是记录并传递当前记录的ID,做为它子节点的PARENTID值
Dim intId As Integer
dv.Table = mySet.Tables("paybasic")
'parentId传递的是 additem函数中的intId.下面语句的作用是找出当前节点的子孩子集合。
dv.RowFilter = "Parent='" & parentId & "'"
'如果当前节点有孩子,则遍历所有的孩子,并调用递归函数。
For Each dvrow In dv
tmpNode = New TreeNode()
'为当前节点的各个属性赋值。
'tmpNode.Target = dvrow("nodeID")
tmpNode.Text = dvrow("Name")
'tmpNode.NavigateUrl = dvrow("Address")
intId = dvrow("Parent")
'添加一个节点
Nds.Add(tmpNode)
'调用递归函数
inittree(Nds(Nds.Count - 1).ChildNodes, intId)
Next
conn.Close()
End Sub
函数调用:
inittree(tvDoorPos.Nodes, 999)
出现了如下错误:
Syntax error in Lookup expression: Expecting keyword 'Parent' followed by a single column argument with possible relation qualifier: Parent[(<relation_name>)].<column_name>.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SyntaxErrorException: Syntax error in Lookup expression: Expecting keyword 'Parent' followed by a single column argument with possible relation qualifier: Parent[(<relation_name>)].<column_name>.

Source Error:


Line 20: dv.Table = mySet.Tables("paybasic")
Line 21: 'parentId传递的是 additem函数中的intId.下面语句的作用是找出当前节点的子孩子集合。
Line 22: dv.RowFilter = "Parent='" & parentId & "'"
Line 23: '如果当前节点有孩子,则遍历所有的孩子,并调用递归函数。
Line 24: For Each dvrow In dv

什么原因啊?我郁闷死了!!!!

请高手最好用.vb.net解答!

...全文
391 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
goody9807 2005-04-29
  • 打赏
  • 举报
回复
首先,我们在SQL SERVER 2000里建立一个表tbTree,表的结构设计如下:
列名 数据类型 描述 长度 主键
ID Int 节点编号 4 是
ParentID Int 父节点编号 4
ConText Nvarchar 我们要显示的节点内容 50

在SQL SERVER 2000中建表的脚本:

CREATE TABLE [dbo].[tbTree] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Context] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[ParentID] [int] NULL
) ON [PRIMARY]

在表中添加如下记录:
SET IDENTITY_INSERT tbtree ON
insert tbtree (ID,Context,ParentID) values ( 1,'中国',0)
insert tbtree (ID,Context,ParentID) values ( 2,'北京',11)
insert tbtree (ID,Context,ParentID) values ( 3,'天津',11)
insert tbtree (ID,Context,ParentID) values ( 4,'河北省',1)
insert tbtree (ID,Context,ParentID) values ( 5,'广东省',1)
insert tbtree (ID,Context,ParentID) values ( 6,'广州',5)
insert tbtree (ID,Context,ParentID) values ( 7,'四川省',1)
insert tbtree (ID,Context,ParentID) values ( 8,'成都',7)
insert tbtree (ID,Context,ParentID) values ( 9,'深圳',5)
insert tbtree (ID,Context,ParentID) values ( 10,'石家庄',4)
insert tbtree (ID,Context,ParentID) values ( 11,'辽宁省',1)
insert tbtree (ID,Context,ParentID) values ( 12,'大连',11)
insert tbtree (ID,Context,ParentID) values ( 13,'上海',1)
insert tbtree (ID,Context,ParentID) values ( 14,'天河软件园',6)
insert tbtree (ID,Context,ParentID) values ( 15,'汕头',5)
SET IDENTITY_INSERT tbtree off

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim ds As New DataSet()
Dim CN As New SqlConnection()
Try
'初始化连接字符串
CN.ConnectionString =
"data source=pmserver;initial catalog=Benchmark;persist security info=False;user id=sa;Password=sa;"
CN.Open()
Dim adp As SqlDataAdapter = New SqlDataAdapter("select * from tbTree", CN)
adp.Fill(ds)
Me.ViewState("ds") = ds
Catch ex As Exception
#If DEBUG Then
Session("Error") = ex.ToString()
Response.Redirect("error.aspx") '̀跳转程序的公共错误处理页面
#End If
Finally
'关闭连接
CN.Close()
End Try
'调用递归函数,完成树形结构的生成
AddTree(0, Nothing)
End Sub

'递归添加树的节点
Private Sub AddTree(ByVal ParentID As Integer, ByVal pNode As TreeNode)
Dim ds As DataSet
ds = Me.ViewState("ds")
Dim dvTree As New DataView()
dvTree = New DataView(ds.Tables(0))
'过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = "PARENTID = " + ParentID.ToString

Dim Row As DataRowView
For Each Row In dvTree
Dim Node As New TreeNode()
If pNode Is Nothing Then '判断是否根节点
'添加根节点
Node.Text = Row("ConText").ToString()
TreeView1.Nodes.Add(Node)
Node.Expanded = True
'再次递归
AddTree(Int32.Parse(Row("ID").ToString()), Node)
Else
'̀添加当前节点的子节点
Node.Text = Row("ConText").ToString()
pNode.Nodes.Add(Node)
Node.Expanded = True
'再次递归
AddTree(Int32.Parse(Row("ID").ToString()), Node)
End If
Next
End Sub
  • 打赏
  • 举报
回复
http://www.microsoft.com/china/community/Column/30.mspx
hedonister 2005-04-29
  • 打赏
  • 举报
回复
直接用这个吧,懒得看你的,这是我自己写的,你自己再改改

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.Web.UI.WebControls

Namespace Tree

Public Class CTreeView
Private Shared Id As String
Private Shared Name As String
Private Shared ParentId As String
Private Shared Url As String
Private Shared Target As String
Private Shared DataSource As DataTable
Private Shared ICount As Integer

Public Sub New()
End Sub

Public Shared Sub CreateTreeView(ByVal ptv As TreeView, ByVal pdt As DataTable, ByVal psArry As String())
Dim strId As String
Dim strName As String
Dim strParentId As String
If Not (psArry.Length = 5) Then
Return
End If
DataSource = pdt
Id = psArry(0).ToString
Name = psArry(1).ToString
ParentId = psArry(2).ToString
Url = psArry(3).ToString
Target = psArry(4).ToString
ICount = DataSource.Rows.Count
Dim i As Integer = 0
While i < ICount
strId = DataSource.Rows(i)(Id).ToString.Trim
strName = DataSource.Rows(i)(Name).ToString.Trim
strParentId = DataSource.Rows(i)(ParentId).ToString.Trim
If strId = strParentId Then
CTreeView.CreateTreeNote(ptv.Nodes, strId, strName, strParentId)
End If
System.Math.Min(System.Threading.Interlocked.Increment(i),i-1)
End While
End Sub

Private Shared Sub CreateTreeNote(ByVal tnc As TreeNodeCollection, ByVal psId As String, ByVal psName As String, ByVal psParentId As String)
Dim tn As TreeNode = New TreeNode
tn.ID = psId
tn.Text = psName
tn.Target = "main"
tn.NavigateUrl = Url + psId
tn.Target = Target
tnc.Add(tn)
Dim strId As String
Dim strName As String
Dim strParentId As String
Dim i As Integer = 0
While i < ICount
strId = DataSource.Rows(i)(Id).ToString.Trim
strName = DataSource.Rows(i)(Name).ToString.Trim
strParentId = DataSource.Rows(i)(ParentId).ToString.Trim
If strParentId = psParentId AndAlso Not (strId = strParentId) Then
CreateTreeNote(tn.Nodes, strId, strName, strId)
End If
System.Math.Min(System.Threading.Interlocked.Increment(i),i-1)
End While
End Sub
End Class
End Namespace
guishuanglin 2005-04-29
  • 打赏
  • 举报
回复
楼主啊,你用个视图不就行了,
每把父ID去过滤,然后把得到的果加了他的子节点,就行了,太简单了!!
如果你想把三四了属性一起存到节点,
继承 TreeNode 加进你要的属性就行了,
chxuxu 2005-04-29
  • 打赏
  • 举报
回复
还是出现我所说的问题,是不是我用ASP.NET2.0BETA2版本的原因?????????????

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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