TreeView 显示树形结构

Treeview增加、删除、修改、遍历等操作
1.使用初步

(1)下载地址
http://msdn.microsoft.com/downloads/samples/internet/default.asp?url=/Downloads/samples/Internet/ASP_DOT_NET_ServerControls/WebControls/default.asp


(2)不显示树型的问题
首先:下载包分自动安装和手动安装两种包。
要下载大小约650K 的自动安装包。
其次:TreeView要求客户端浏览器版本为IE5.5及以上,最好要求客户端升级为IE6.0

(3)关于闪烁
将AutoPostBack属性设置为真,SelectedIndexChange才能被执行。不过这样的话刷新的很厉害。不要刷新的话,将AutoPostBack属性设置为FALSE.  

(4)常用的几个属性和方法
~Index 获取树节点在树节点集合中的位置。
~Nodes 获取分配给树视图控件的树节点集合。
~Parent 获取或设置控件的父容器。
~SelectedNode 获取或设置当前在树视图控件中选定的树节点。
~ExpandAll 展开所有树节点。
~Checked 获取或设置一个值,用以指示树节点是否处于选中状态。
~Text 获取或设置在树节点标签中显示的文本。
~Expand 展开树节点。
~Clear 清空树
~Remove 从树视图控件中移除当前树节点。

(5)常用的几个操作:增加、删除、修改、剪切

@增加节点:
  Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode()
  Dim NdSel As New Microsoft.Web.UI.WebControls.TreeNode()
  'NdSel 为当前选定的节点,新节点将作为它的子节点 
  NdSel = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)
  tmpNd3.Text = "新增节点"
  '在树中添加这个新节点
  NdSel.Nodes.Add(tmpNd3)
@删除节点:
  Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode()
  Dim NdSel As New Microsoft.Web.UI.WebControls.TreeNode()
  'NdSel 为当前选定的要删除节点,tmpNd3为它的父节点 
  NdSel = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)
  If (Treepaybasic.SelectedNodeIndex <> "0") Then
  tmpNd3 = NdSel.Parent
  tmpNd3.Nodes.Remove(NdSel)
  Else
  Treepaybasic.Nodes.Clear()
  End If
@修改节点:
  Dim NdSel As New Microsoft.Web.UI.WebControls.TreeNode()
  NdSel = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)
  NdSel.Text = "aaa"
@剪切和粘贴

剪切:
  Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode()
  Dim NdSel As New Microsoft.Web.UI.WebControls.TreeNode()
  'NdSel 为当前选定的要删除节点,tmpNd3为它的父节点 
  NdSel = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)
  '将剪切下来的节点存入session
  Session("node") = NdSel
  If (Treepaybasic.SelectedNodeIndex <> "0") Then
  tmpNd3 = NdSel.Parent
  tmpNd3.Nodes.Remove(NdSel)
  End If
粘贴:
  Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode()
  Dim NdSel As New Microsoft.Web.UI.WebControls.TreeNode()
  'NdSel 为当前要粘贴节点的父节点 
  NdSel = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)
  tmpNd3 = Session("node")
  NdSel.Nodes.Add(tmpNd3)
2.用递归生成树的算法和数据库设计
(1)递归说明
  程序调用自身的编程方法称为递归(recursion)。在树的生成以及图的遍历中,递归用的很多。经典的算法求 n! (求n的阶乘)中,用的就是递归方法。递归算法的优点就是简洁,可扩充性好。但是缺点也很明显:低效。因为递归就是程序不断调用自身,对系统的资源消耗比较大。随着节点的增多,执行效率会变的很低。 
  为了解决树在生成过程中的层树不定的问题,同时也是为了让树的扩展性更好。树的生成使用了递归的方法。生成树的代码一旦写成,可以不改动源代码,生成无限级层次的树。树的结构完全由数据库中表的数据决定。
(2)数据库设计
  创建一个数据库,设计树图信息表Treetable,表中属性包含Nodeid、Parentid、Nodename、Address等字段(分别用于表示节点的ID、父节点ID、节点名称、链接地址),其它属性根据实际用户需求和设计而定。节点名称Nodename将在树型控件的节点上显示,Nodeid字段保存节点的唯一标识号,Parentid表示当前节点的父节点ID号(例如有两个节点是父子关系,孩子节点的Parentid值就是其父节点的Nodeid),节点号父子相接组成了一个“链表”,表征并记录了树上节点的层次结构。
表具体设计如下:(简化模型,实际使用的要复杂一些)

主键 属性名 类型 长度 可空 属性含义
是 Nodeid int 6 否 节点ID
 Parentid int 6 否 父节点ID
 Nodename char 50 否 节点名称
 Address char 80 可 链接地址

备注:链接地址 主要是用在: 树在框架中使用的环境。链接可以指向其他框架页中的地址或是带不同的参数。
   

(3)程序代码
――――――――――――递归函数――――――――――――
  '生成树的函数
  Private Sub inittree(ByRef Nds As Microsoft.Web.UI.WebControls.TreeNodeCollection, ByVal parentId As Integer)
  Dim dv As New DataView()
  Dim dvrow As DataRowView
  Dim tmpNode As Microsoft.Web.UI.WebControls.TreeNode
  'intId为数值型变量,其作用是记录并传递当前记录的ID,做为它子节点的PARENTID值
  Dim intId As Integer
  dv.Table = mySet.Tables("paybasic")
  'parentId传递的是 additem函数中的intId.下面语句的作用是找出当前节点的子孩子集合。 
  dv.RowFilter = "parentID='" & parentId & "'"
  '如果当前节点有孩子,则遍历所有的孩子,并调用递归函数。
  For Each dvrow In dv
  tmpNode = New Microsoft.Web.UI.WebControls.TreeNode()
  '为当前节点的各个属性赋值。
  tmpNode.ID = dvrow("nodeID")
  tmpNode.Text = dvrow("nodename")
  tmpNode.NavigateUrl = dvrow("Address")
  intId = dvrow("parentID")
  '添加一个节点
  Nds.Add(tmpNode)
  '调用递归函数
  inittree(Nds(Nds.Count - 1).Nodes, intId)
  Next
End Sub
――――――――――――――――调用递归函数――――――――――――――――――
CreateReaderDataSet()
inittree(Treepaybasic.Nodes, 999)
―――――――――――――――――生成数据集―――――――――――――――――――
  '生成数据集的函数
  Private Sub CreateReaderDataSet()
  '在运行时连接,并设置连接属性
  MyConn = New System.Data.OleDb.OleDbConnection("Provider=MSDAORA.1;Data Source=oracle9;User ID=user;Password=****;")
  '设置SelectCommand命令
  myAdapter.SelectCommand = New System.Data.OleDb.OleDbCommand("select * from treenode", MyConn)
  '填充数据集
  myAdapter.Fill(mySet, "treenode")
  End Sub
与数据库相关的节点操作:
(1)添加节点
  1.1 节点的树型添加
  //程序的功能是在点击的节点下面添加新节点
  Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode()
  Dim NdSel As New Microsoft.Web.UI.WebControls.TreeNode()
  'NdSel 为当前选定的要删除节点,tmpNd3为它的父节点 
  NdSel = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)
  '要添加的节点的各个属性
  tmpNd3.ID = 111
  tmpNd3.Text = "aaa"
  '用nodes.add添加节点
  NdSel.Nodes.Add(tmpNd3)
   
  1.2 数据库中的节点添加操作
  //数据库连接语句在此省略
  '在运行时连接,并设置连接属性
  Dim insertcomm = New System.Data.OleDb.OleDbCommand()
  '定义存储命令的各种属性
  insertcomm.CommandText = "insert into treebasic(id,parentid,name) values('" & pid & "','" & parid & "','" & nodetext & "')"
  insertcomm.Connection = MyConn
  '打开连接、执行命令
  MyConn.Open()
  insertcomm.ExecuteNonQuery()
  MyConn.Close()
(2)修改节点
  2.1 节点属性的树型修改
  Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode()
  'tmpNd3 为当前选定的节点
  tmpNd3 = Treepaybasic.GetNodeFromIndex(Treepaybasic.SelectedNodeIndex)
  tmpNd3.Text = "aaa"
  2.2 数据库中的节点属性修改操作
  '定义修改命令的属性
  Dim updatecomm = New System.Data.OleDb.OleDbCommand()
  '定义修改命令的各种属性
  updatecomm.CommandText = "update treebasic set name='" & nodetext & "' ,remark='" & remark & "' ,links='" & purl & "' where payid=" & CInt(pid) & ""
  updatecomm.Connection = MyConn
  '打开连接、执行命令
  MyConn.Open()
  updatecomm.ExecuteNonQuery()
  MyConn.Close()

查找节点并展开的例子,你看看:
  Private Sub findandexpand_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

  'Treepaybasic.Nodes(0) 为树的跟节点,从根节点找起
  If (Treepaybasic.Nodes(0).Text = Me.TextBox1.Text) Then
  Treepaybasic.SelectedNodeIndex = "0"
  Else
  '要找的节点不是根节点,调用递归函数查找
  findnode(Treepaybasic.Nodes)
  End If
  End Sub
  '查找节点的函数
  Sub findnode(ByRef Nds As Microsoft.Web.UI.WebControls.TreeNodeCollection)
  '定义一个节点的集合
  Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode()
  '在当前节点的所有孩子里查找
  For Each tmpNd3 In Nds
  '如果当前节点有孩子,那么调用递归函数继续向下找
  If tmpNd3.Nodes.Count <> 0 Then
  findnode(tmpNd3.Nodes)
  Else
  '如果已经是叶子节点,那么比较值,如果就是要找的节点。取得节点的index
  If (tmpNd3.Text = TextBox1.Text) Then
  Dim index1 As String = tmpNd3.GetNodeIndex()
  '调用展开节点函数,并且选中这个节点
  expand(index1)
  End If
  End If
  Next
  End Sub
  '展开节点的函数,并且选中节点
  Sub expand(ByRef index As String)
  Dim i As Integer
  '节点在第n层,展开n-1次。节点如果在第二层,展开一次即可。
  For i = 1 To index.Replace(".", "").Length - 1
  Dim tmpNd3 As New Microsoft.Web.UI.WebControls.TreeNode()
  tmpNd3 = Treepaybasic.GetNodeFromIndex(Left(index, 2 * i - 1))
  tmpNd3.Expanded = True
  Next
  '选中节点
  Treepaybasic.SelectedNodeIndex = index
  End Sub


尽量不要在treenode_SelectedIndexChange事件中写内容。
建议采用框架+联接的方式。
下面给个例子,点击节点,显示次节点的详细信息:

(1)通过链接地址取得变量:  
  nodeid = Me.Request.QueryString("nodeid")

(2)以此变量查询数据可库相关数据

  '在运行时连接,并设置连接属性
  MyConn = New System.Data.OleDb.OleDbConnection("Provider=MSDAORA.1;Data Source=oracle;User ID=user;Password=user;")
  '定义选择条件字符串
  Dim strselect As String
  '实例化选择条件字符串,在所要查找的数据表中取出所有的数据。
  strselect= "select * from tablebasic where id='" & nodeid & "'"
  myAdapter.SelectCommand = New System.Data.OleDb.OleDbCommand(strselect, MyConn)
  '填充数据集
  myAdapter.Fill(mySet, "treenode")
  '指定myGrid的数据源
  Me.DataGridnode.DataSource = Me.mySet.Tables("treenode")
  '数据绑定
  Me.DataGridnode.DataBind()

(3)设置数据表.显示相关的字段即可.


点击节点后,显示与节点相关的数据:
程序结构就是使用框架,在左边显示树,在右边显示与树节点相关的信息。
A页面:
  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  '在此处放置初始化页的用户代码
  If Page.IsPostBack = False Then
  CreateReaderDataSet()
  '调用生成树的函数,生成工资标准树。其中Treepaybasic是TreeView的ID,999是根节点的父ID(事实上不存在)
  inittree(Treepaybasic.Nodes, 999)
  End If
  End Sub
  '生成树的函数
  Private Sub inittree(ByRef Nds As Microsoft.Web.UI.WebControls.TreeNodeCollection, ByVal parentId As Integer)
  Dim dv As New DataView()
  Dim drv As DataRowView
  Dim tmpNd As Microsoft.Web.UI.WebControls.TreeNode
  'intId为数值型变量,其作用是记录并传递当前记录的ID,做为它子节点的PARENTID值
  Dim intId As Integer
  dv.Table = mySet.Tables("paybasic")
  'parentId传递的是 additem函数中的intId.下面语句的作用是找出当前节点的子孩子集合。 
  dv.RowFilter = "parentID='" & parentId & "'"
  '如果当前节点有孩子,则遍历所有的孩子,并调用递归函数。
  For Each drv In dv
  tmpNd = New Microsoft.Web.UI.WebControls.TreeNode()
  '为当前节点的各个属性赋值。
  tmpNd.ID = drv("payID")
  tmpNd.Text = drv("name")
  最需要的一条语句
  tmpNd.NavigateUrl = ◎◎##、、根据需要添加链接
  intId = drv("payID")
  '添加一个节点,然后直接找它的孩子
  Nds.Add(tmpNd)
  '相当于函数的嵌套。
  inittree(Nds(Nds.Count - 1).Nodes, intId)
  Next
  End Sub

-----------------------------

B页面:
  Request.Params("id")
获取参数后,进行判断。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值