这两天有空啊,决定来改造一下TreeView控件,TreeView的数据源只能是xml,如果要从数据库里读取数据来动态的生成节点要怎么办呢?网上多数人使用的方法是从数据库里面读取数据存成xml格式.但是我想让它能够直接从数据库里面读取数据来生成呢?于是要对它进行改造,TreeView体现的是层次结构,在关系数据库设计的时候要体现层次结构一般使用多个表,通过主,外键来建立关系.这里假设数据分别存在n个表中,分别是table1,table2,......,table(n).分别存的是TreeView的各个层次,这n个表应该有相同的结构(除了根节点的表),我们假设表的结构是这样的[ID,...,fatherID]中ID是主键,fatherID是外键(父节点的ID).我们决定为TreeView增加一个Dateset属性,Link属性
private ds as dataset
private slink as string
public property Dataset()
get()
return ds
end get
Set(ByVal value)
ds = value
End Set
End Property
ds = value
End Set
End Property
public property Link()
get()
return slink end get
Set(ByVal value)
slink = value
End Set
End Property
slink = value
End Set
End Property
在Treeview的page_load事件添加下面的代码
If Not IsPostBack Then
For Each row In ds.Tables(0).Rows
Dim node As New TreeNode
node.Value = row.Item(0)
node.Text = row.Item(1)
TreeView1.Nodes.Add(node)
Next
End If
For Each row In ds.Tables(0).Rows
Dim node As New TreeNode
node.Value = row.Item(0)
node.Text = row.Item(1)
TreeView1.Nodes.Add(node)
Next
End If
这里已经添加了根节点了.
在Treeview的TreeView1_SelectedNodeChanged时间下面添加下面代码
Dim i As Int16
i = TreeView1.SelectedNode.ChildNodes.Count
If i > 0 Then
TreeView1.SelectedNode.Expand()'判断是否已经添加了节点
Else
i = TreeView1.SelectedNode.ChildNodes.Count
If i > 0 Then
TreeView1.SelectedNode.Expand()'判断是否已经添加了节点
Else
If TreeView1.SelectedNode.Depth + 1 < ds.Tables.Count Then
For Each row In ds1.Tables(TreeView1.SelectedNode.Depth + 1).Rows
If row.Item(link) = TreeView1.SelectedNode.Value Then
Dim node As New TreeNode
node.Value = row.Item(0)
node.Text = row.Item(1)
TreeView1.SelectedNode.ChildNodes.Add(node)
End If
Next
TreeView1.SelectedNode.Expand()
End If
End If
For Each row In ds1.Tables(TreeView1.SelectedNode.Depth + 1).Rows
If row.Item(link) = TreeView1.SelectedNode.Value Then
Dim node As New TreeNode
node.Value = row.Item(0)
node.Text = row.Item(1)
TreeView1.SelectedNode.ChildNodes.Add(node)
End If
Next
TreeView1.SelectedNode.Expand()
End If
End If
到这就已经完成了节点的添加了,要使用它只需要给它一个dataset 就ok了,它对dataset还有一定的要求:
即其中的表要按照层次结构来排列,使用方法在下面
Dim conn As SqlConnection
Dim cmdstr As String
Dim ds As New DataSet
Dim da As SqlDataAdapter
conn = New SqlConnection(连接字符串)
cmdstr = "SELECT * FROM table1; SELECT * FROM table12 ;...;SELECT * FROM table1(n)"
da = New SqlDataAdapter(cmdstr, conn)
da.Fill(ds)
superTreeview1.set_dataset(ds)
superTreeview1.Link= 3
Dim cmdstr As String
Dim ds As New DataSet
Dim da As SqlDataAdapter
conn = New SqlConnection(连接字符串)
cmdstr = "SELECT * FROM table1; SELECT * FROM table12 ;...;SELECT * FROM table1(n)"
da = New SqlDataAdapter(cmdstr, conn)
da.Fill(ds)
superTreeview1.set_dataset(ds)
superTreeview1.Link= 3
这样就行了,但是这只是添加了接点并没有实际意义,所以我们需要让Treeview返回一些必要的数据,是我们能够根据返回数据作出判断.
我选择了返回当前节点的depth和value.你也可以返回其他的.
我会在最近的时间给出下载地址的
浙公网安备 33010602011771号