TreeView相关

原创 2005年02月28日 16:36:00

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

 

 


.NET平台下Web树形结构程序设计

    我的上篇文章《树形结构在开发中的应用》主要是在Windows Form下的实现,下面是Web Form下的实现。

数据库设计

首先,我们在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,'北京',1)

insert tbtree (ID,Context,ParentID)  values ( 3,'天津',1)

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


 http://www.microsoft.com/china/community/Columns/Lihonggen/image/1-1.jpg
下载Treeview控件地址
http://msdn.microsoft.com/downloads/samples/internet/ASP_DOT_NET_ServerControls/WebControls/default.asp
安装后,通过“自定义工具箱”->“.net框架组件”把TreeView添加到工具箱里。
新建一个项目,选择Visual Basic.Net 工程Asp.net Web应用程序,在页面上拖画一个TreeView控件。
 
 
Html页:

<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="Tree.WebForm1"%>

    

        

        

        

        

         http://schemas.microsoft.com/intellisense/ie5">

    

    

        

             

                   <?xml:namespace prefix = iewc />

        

    


 
后台代码:

    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


C#版本:
 
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Microsoft.Web.UI.WebControls;
using System.Data.SqlClient;
namespace TreeCS
{
       ///
       /// WebForm1 的摘要说明
       ///
       public class WebForm1 : System.Web.UI.Page
       {
              protected Microsoft.Web.UI.WebControls.TreeView TreeView1;
      
              private void Page_Load(object sender, System.EventArgs e)
              {
                     // 定义数据库连接
                     SqlConnection CN = new SqlConnection();
                     try
                     {
                            //初始化连接字符串
                            CN.ConnectionString= "data source=pmserver;initial catalog=Benchmark;persist security info=False;user id=sa;Password=sa;";
                            CN.Open();
 
                            SqlDataAdapter adp = new SqlDataAdapter("select * from tbTree",CN);
                            DataSet ds=new DataSet();
                            adp.Fill(ds);
                            this.ViewState["ds"]=ds;
                     }
                     catch (Exception ex)
                     {
                            Session["Error"] = ex.ToString();
                            Response.Redirect("error.aspx");       //̀跳转程序的公共错误处理页面
                     }
                     finally
                     {
                            CN.Close();
                     }
                     //调用递归函数,完成树形结构的生成
                     AddTree(0, (TreeNode)null);
              }
 
              //递归添加树的节点
              public void AddTree(int ParentID,TreeNode pNode)
              {
                     DataSet ds=(DataSet) this.ViewState["ds"];
                     DataView dvTree = new DataView(ds.Tables[0]);
                     //过滤ParentID,得到当前的所有子节点
                     dvTree.RowFilter =  "[PARENTID] = " + ParentID;
 
                     foreach(DataRowView Row in dvTree)
                     {
                            TreeNode Node=new TreeNode() ;
                            if(pNode == null)
                            {    //添加根节点
                                   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);     //再次递归
                            }
                     }                  
              }           
 
              #region Web Form Designer generated code
              override protected void OnInit(EventArgs e)
              {
                     //
                     // CODEGEN该调用是 ASP.NET Web 窗体设计器所必需的。
                     //
                     InitializeComponent();
                     base.OnInit(e);
              }
             
              ///
              ///设计器支持所需的方法 - 不要使用代码编辑器修改
              /// 此方法的内容
              ///
              private void InitializeComponent()
              {   
                     this.Load += new System.EventHandler(this.Page_Load);
 
              }
              #endregion
       }
}
 
后记:请读者自行修改程序中的连接字符串设置。
 
声明:本文版权与解释权归李洪根所有,如需转载,请保留完整的内容及此声明。
QQ: 21177563  
MSN: lihonggen@hotmail.com
专栏:http://www.csdn.net/develop/author/netauthor/lihonggen0/

TreeView样式相关

  • 2012年07月05日 15:13
  • 3.92MB
  • 下载

TreeView样式相关

  • 2011年11月24日 07:12
  • 1.83MB
  • 下载

C#TreeView控件与XML相关操作

在C#的应用开发中,TreeView控件是一种比较常用的控件,主要反映了父子节点之间的关系,由于TreeView控件与XML文件的组织结构比较类似,可以把TreeView控件与XML文件结合使用。Tr...

TreeView相关实例

  • 2007年08月22日 11:51
  • 1.1MB
  • 下载

C#中处理treeview相关的类函数和过程汇总(采用递归算法,支持无限级节点)

using System.Data; using System.Data.Common; using System.IO; using System.IO.Compression; using...
  • postfxj
  • postfxj
  • 2014年10月08日 16:25
  • 613

黑马程序员_学习日记53_625三层项目(FTP相关操作、递归TreeView、三层结构)

1、通过WebClient操作ftp WebClient是对WebResponse和WebRequest的封装 //下载 WebClient wc = new WebClient(); //C...

【转】我刚做的一个TreeView的CheckBox进行选中插入数据库,从数据库中读取数据后让CheckBox勾选的代码!

转自:http://www.cnblogs.com/12go/archive/2011/08/27/2155581.html  #region 绑定角色     ///     ///...

bootstrap-Treeview实现级联勾选

bootstrap-treeview插件默认不支持级联勾选的,想要实现那就要自己动手了

ucGUI做的一个TreeView这样的控件!

用ucGUI做了一个TreeView这样的控件!我用的版本里没有TreeView这个控件,所以自己做了一个. 这个做得比较难看呀! 个人头脑比较简单,所以做的思路也比较简单! 所以后面的代码也很简...
  • jhting
  • jhting
  • 2012年06月27日 14:06
  • 3766

C# TreeView控件动态组树(可控制节点级别)

需求分析: 面对如此“强(wu)大(yu)”的需求,本菜鸟也是想尽办法做封装,来帮助深陷huohai的亲们。。我们的查询界面变成了树+下拉框+复选框,每个界面都有树,我就索性把树封装了,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TreeView相关
举报原因:
原因补充:

(最多只允许输入30个字)