Asp.net 从查询动态生成TreeView控件(VB.NET)
我过去从未使用过TreeView,我想显示一个层次结构(n个级别的递归关系)。数据(在数据集中可用-从数据库查询检索)具有以下结构:Asp.net 从查询动态生成TreeView控件(VB.NET),asp.net,vb.net,treeview,dataset,Asp.net,Vb.net,Treeview,Dataset,我过去从未使用过TreeView,我想显示一个层次结构(n个级别的递归关系)。数据(在数据集中可用-从数据库查询检索)具有以下结构: __ID__ | __NAME__ | __PARENT__ 1 | Patrick | 2 | Mark | 3 | Scott | 2 4 | Jason | 5 | Julian | 6 | John | 6 7
__ID__ | __NAME__ | __PARENT__
1 | Patrick |
2 | Mark |
3 | Scott | 2
4 | Jason |
5 | Julian |
6 | John | 6
7 | Steve |
8 | George | 1
9 | Robert | 1
10 | Rodney | 8
我试图产生以下输出
- Patrick [1]
- George [8]
- Rodney [10]
- Robert [9]
- Mark [2]
- Scott [3]
- Julian [5]
- John [6]
- Jason [4]
- Steve [7]
我正在尝试生成Treeview控件,但没有使用Treeview的经验。对于如何实现这一点的任何反馈或示例,我们都将不胜感激。这里的重点是提供一种通用且适应性强的算法,能够执行所需的排序。一旦设置好,将值写入
TreeView
非常简单,只需添加节点
和子节点
Dim NAME(10) As String
Dim PARENT(10) As Integer
Dim curID As Integer = 0
curID = 1
NAME(curID) = "Patrick [" & curID.ToString() & "]"
PARENT(curID) = 0
curID = curID + 1
NAME(curID) = "Mark [" & curID.ToString() & "]"
PARENT(curID) = 0
curID = curID + 1
NAME(curID) = "Scott [" & curID.ToString() & "]"
PARENT(curID) = 2
curID = curID + 1
NAME(curID) = "Jason [" & curID.ToString() & "]"
PARENT(curID) = 0
curID = curID + 1
NAME(curID) = "Julian [" & curID.ToString() & "]"
PARENT(curID) = 0
curID = curID + 1
NAME(curID) = "John [" & curID.ToString() & "]"
PARENT(curID) = 6
curID = curID + 1
NAME(curID) = "Steve [" & curID.ToString() & "]"
PARENT(curID) = 0
curID = curID + 1
NAME(curID) = "George [" & curID.ToString() & "]"
PARENT(curID) = 1
curID = curID + 1
NAME(curID) = "Robert [" & curID.ToString() & "]"
PARENT(curID) = 1
curID = curID + 1
NAME(curID) = "Rodney [" & curID.ToString() & "]"
PARENT(curID) = 8
Dim completed As Boolean = False
Dim firstIteration As Boolean = True
Dim totIDs As Integer = 10
Do
curID = 0
Do
curID = curID + 1
If (firstIteration) Then
If (PARENT(curID) = 0 And TreeView1.FindNode(NAME(curID)) Is Nothing) Then
TreeView1.Nodes.Add(New TreeNode(NAME(curID)))
End If
Else
If (PARENT(curID) > 0) Then
Dim targetNodes As TreeNodeCollection = TreeView1.Nodes
Dim count As Integer = 0
If (TreeView1.FindNode(NAME(curID)) Is Nothing) Then
For Each node As TreeNode In targetNodes
count = count + 1
If (node.Text.Contains("[" & PARENT(curID).ToString() & "]")) Then
node.ChildNodes.Add(New TreeNode(NAME(curID)))
Exit For
End If
Next
End If
End If
End If
Loop While (curID < totIDs)
If (firstIteration) Then
firstIteration = False
Else
Exit Do 'Just two iterations
End If
Loop While (Not completed)
Dim名称(10)作为字符串
将父项(10)设置为整数
Dim curID为整数=0
库里=1
名称(curID)=“Patrick[”&curID.ToString()&“]”
父(curID)=0
居里=居里+1
名称(curID)=“标记[”&curID.ToString()&“]
父(curID)=0
居里=居里+1
名称(curID)=“Scott[”&curID.ToString()&“”
父(curID)=2
居里=居里+1
名称(curID)=“Jason[”&curID.ToString()&“]”
父(curID)=0
居里=居里+1
名称(curID)=“Julian[”&curID.ToString()&“]”
父(curID)=0
居里=居里+1
NAME(curID)=“John[”&curID.ToString()&“]”
父(curID)=6
居里=居里+1
NAME(curID)=“Steve[”&curID.ToString()&“]”
父(curID)=0
居里=居里+1
名称(curID)=“George[”&curID.ToString()&“]”
父(curID)=1
居里=居里+1
名称(curID)=“Robert[”&curID.ToString()&“]”
父(curID)=1
居里=居里+1
名称(curID)=“Rodney[”&curID.ToString()&“]
父(curID)=8
Dim已完成,布尔值=False
Dim firstIteration作为布尔值=真
Dim totIDs为整数=10
做
库里=0
做
居里=居里+1
如果(第一次迭代)那么
如果(PARENT(curID)=0且TreeView1.FindNode(NAME(curID))为空,则
添加(新树节点(名称(curID)))
如果结束
其他的
如果(父项(curID)>0),则
将targetNodes调暗为TreeNodeCollection=TreeView.Nodes
Dim计数为整数=0
如果(TreeView1.FindNode(NAME(curID))为空),那么
对于每个节点,作为targetNodes中的TreeNode
计数=计数+1
如果(node.Text.Contains(“[”&PARENT(curID.ToString()&“])),则
node.ChildNodes.Add(新树节点(名称(curID)))
退出
如果结束
下一个
如果结束
如果结束
如果结束
循环时间(curID
此代码依赖于两个数组(NAME
(字符串),其中还包括[original position]和PARENT
(整数)),并执行包含,直到“第二级”,即主节点和第一个子节点
我想您将有足够的信息来理解如何处理
TreeView
,并构建能够执行所需排序的算法。要从数据表填充TreeView,请尝试以下代码
Dim DataTable1 As New DataTable
Private Sub FillTestTable()
DataTable1.Columns.Add("ID", GetType(Integer))
DataTable1.Columns.Add("NAME", GetType(String))
DataTable1.Columns.Add("PARENT", GetType(Integer))
DataTable1.Columns.Add("LEVEL", GetType(Integer))
DataTable1.Rows.Add(1, "Patrick")
DataTable1.Rows.Add(2, "Mark")
DataTable1.Rows.Add(3, "Scott", 2)
DataTable1.Rows.Add(4, "Jason")
DataTable1.Rows.Add(5, "Julian")
DataTable1.Rows.Add(6, "John", 5)
DataTable1.Rows.Add(7, "Steve")
DataTable1.Rows.Add(8, "George", 1)
DataTable1.Rows.Add(9, "Robert", 1)
DataTable1.Rows.Add(10, "Rodney", 8)
Dim i As Integer
For i = 0 To DataTable1.Rows.Count - 1
Dim ID1 As String = DataTable1.Rows(i).Item("ID").ToString
DataTable1.Rows(i).Item("LEVEL") = FindLevel(ID1, 0)
Next
End Sub
Private Function FindLevel(ByVal ID As String, ByRef Level As Integer) As Integer
Dim i As Integer
For i = 0 To DataTable1.Rows.Count - 1
Dim ID1 As String = DataTable1.Rows(i).Item("ID").ToString
Dim Parent1 As String = DataTable1.Rows(i).Item("PARENT").ToString
If ID = ID1 Then
If Parent1 = "" Then
Return Level
Else
Level += 1
FindLevel(Parent1, Level)
End If
End If
Next
Return Level
End Function
VB.NET WindowsForms应用程序的代码
Private Sub CreateTree()
Dim MaxLevel1 As Integer = CInt(DataTable1.Compute("MAX(LEVEL)", ""))
Dim i, j As Integer
For i = 0 To MaxLevel1
Dim Rows1() As DataRow = DataTable1.Select("LEVEL = " & i)
For j = 0 To Rows1.Count - 1
Dim ID1 As String = Rows1(j).Item("ID").ToString
Dim Name1 As String = Rows1(j).Item("NAME").ToString
Dim Parent1 As String = Rows1(j).Item("PARENT").ToString
If Parent1 = "" Then
TreeView1.Nodes.Add(ID1, Name1)
Else
Dim TreeNodes1() As TreeNode = TreeView1.Nodes.Find(Parent1, True)
If TreeNodes1.Length > 0 Then
TreeNodes1(0).Nodes.Add(ID1, Name1)
End If
End If
Next
Next
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
FillTestTable()
CreateTree()
TreeView1.ExpandAll()
End Sub
Private Sub CreateTree()
Dim MaxLevel1 As Integer = CInt(DataTable1.Compute("MAX(LEVEL)", ""))
Dim i, j As Integer
For i = 0 To MaxLevel1
Dim Rows1() As DataRow = DataTable1.Select("LEVEL = " & i)
For j = 0 To Rows1.Count - 1
Dim ID1 As String = Rows1(j).Item("ID").ToString
Dim Name1 As String = Rows1(j).Item("NAME").ToString
Dim Parent1 As String = Rows1(j).Item("PARENT").ToString
If Parent1 = "" Then
TreeView1.Nodes.Add(New TreeNode(Name1, ID1))
Else
Dim Node1 As TreeNode = GetChildByValue(Parent1, TreeView1.Nodes)
If Not Node1 Is Nothing Then
Node1.ChildNodes.Add(New TreeNode(Name1, ID1))
End If
End If
Next
Next
End Sub
Private Function GetChildByValue(ByVal ID1 As String, ByVal NodeCollection1 As TreeNodeCollection) As TreeNode
For Each TreeNode1 As TreeNode In NodeCollection1
If TreeNode1.Value = ID1 Then
Return TreeNode1
Else
Dim TreeNode2 As TreeNode = GetChildByValue(ID1, TreeNode1.ChildNodes)
If Not TreeNode2 Is Nothing Then
Return TreeNode2
End If
End If
Next
Return Nothing
End Function
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
FillTestTable()
CreateTree()
TreeView1.ExpandAll()
End Sub
ASP.NET应用程序的代码
Private Sub CreateTree()
Dim MaxLevel1 As Integer = CInt(DataTable1.Compute("MAX(LEVEL)", ""))
Dim i, j As Integer
For i = 0 To MaxLevel1
Dim Rows1() As DataRow = DataTable1.Select("LEVEL = " & i)
For j = 0 To Rows1.Count - 1
Dim ID1 As String = Rows1(j).Item("ID").ToString
Dim Name1 As String = Rows1(j).Item("NAME").ToString
Dim Parent1 As String = Rows1(j).Item("PARENT").ToString
If Parent1 = "" Then
TreeView1.Nodes.Add(ID1, Name1)
Else
Dim TreeNodes1() As TreeNode = TreeView1.Nodes.Find(Parent1, True)
If TreeNodes1.Length > 0 Then
TreeNodes1(0).Nodes.Add(ID1, Name1)
End If
End If
Next
Next
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
FillTestTable()
CreateTree()
TreeView1.ExpandAll()
End Sub
Private Sub CreateTree()
Dim MaxLevel1 As Integer = CInt(DataTable1.Compute("MAX(LEVEL)", ""))
Dim i, j As Integer
For i = 0 To MaxLevel1
Dim Rows1() As DataRow = DataTable1.Select("LEVEL = " & i)
For j = 0 To Rows1.Count - 1
Dim ID1 As String = Rows1(j).Item("ID").ToString
Dim Name1 As String = Rows1(j).Item("NAME").ToString
Dim Parent1 As String = Rows1(j).Item("PARENT").ToString
If Parent1 = "" Then
TreeView1.Nodes.Add(New TreeNode(Name1, ID1))
Else
Dim Node1 As TreeNode = GetChildByValue(Parent1, TreeView1.Nodes)
If Not Node1 Is Nothing Then
Node1.ChildNodes.Add(New TreeNode(Name1, ID1))
End If
End If
Next
Next
End Sub
Private Function GetChildByValue(ByVal ID1 As String, ByVal NodeCollection1 As TreeNodeCollection) As TreeNode
For Each TreeNode1 As TreeNode In NodeCollection1
If TreeNode1.Value = ID1 Then
Return TreeNode1
Else
Dim TreeNode2 As TreeNode = GetChildByValue(ID1, TreeNode1.ChildNodes)
If Not TreeNode2 Is Nothing Then
Return TreeNode2
End If
End If
Next
Return Nothing
End Function
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
FillTestTable()
CreateTree()
TreeView1.ExpandAll()
End Sub
谢谢你,大卫!我不得不将“TreeView1.Nodes.Add(ID1,Name1)”替换为“TreeView1.Nodes.Add(New TreeNode(ID1,Name1))”以下行“TreeView1.Nodes.Find(Parent1,True)(0).Nodes.Add(ID1,Name1)”生成以下错误:“Find”不是“System.Web.UI.WebControls.TreeNodeCollection”的成员我的初始代码是针对Windows窗体应用程序的,请参阅ASP.NET版本的编辑代码。我还对代码做了一些改进。