try this:
http://msdn.microsoft.com/library/default.asp?url=/workshop/webcontrols/overview/treeview.asp

解决方案 »

  1.   

    树形图用于显示按照树形结构进行组织的数据,其用途比较广泛,如计算机中的文件系统(Windows中的资源管理器)、企业或公司的组成结构等。我们知道在Windows下VB、PB、Delphi等工具提供了一个功能很强的树型控件TreeView,利用Treeview控件可以方便地开发树形图。然而在网页上实现树形图就不那么容易了,现在在ASP.NET中利用微软提供的Internet Explorer WebControls它使得网页上的树形图开发与在Windows下一样的方便,一样的功能强大,甚至更灵活。
    本文介绍用Internet Explorer WebControls开发树形图的方法,详细阐述在ASP.NET下如何将Internet Explorer WebControls的使用与数据库联系起来,实现数据分任意多层显示,方便地进行增加、修改、删除、移动操作。
    Internet Explorer WebControls不在VS.NET的标准Server Control中,要到微软的站点上下载,下载地址是:
    http://msdn.microsoft.com/downloads/samples/internet/default.asp?url=/Downloads/samples/Internet/ASP_DOT_NET_ServerControls/WebControls/default.asp
    下载安装后第一次使用时,要右击工具箱Customize Toolbox…→.NET Framework Components中找到Micosoft.Web.UI.WebControls.Treeview后选中,这样Treeview控件就出现在工具箱中了。
    动态加载目录书有不同的方法,我将结合实例介绍两种常用的方法。
    1.利用树形图信息表进行初始化。
    这种方法在页面初始化的时候一次性将目录书的所有节点全部初始化。适合目录树结点较少,并且相对固定的情况。树的建立 
    具体方法是:创建一个数据库,设计树图信息表TREE_INFO,包含NODEID、PARENTID、NODENAME、ADDERSS、ICON字段,其它字段根据实际业务而定,节点名称NODENAME将在树型控件的节点上显示,NODEID字段保存节点的唯一标识号,PARENTID表示当前节点的父节点号,标识号组成了一个“链表”,记录了树上节点的结构。设计一个Web窗体其上放置TreeView控件。
    实例的表结构如下:主键 字段名 类型 长度 可空
    1 NODEID int 4 0
    0 PARENTID int 4 0
    0 NODENAME nvarchar 100 0
    0 ADDERSS nvarchar 100 1
    0 Img nvarchar 100 1
    0 ImgEx nvarchar 100 1实例程序如下:
    public class WebForm1 : System.Web.UI.Page
    {
    protected Microsoft.Web.UI.WebControls.Toolbar Toolbar1;
    protected Microsoft.Web.UI.WebControls.TreeView TreeView1;
    protected System.Web.UI.WebControls.Label a;
    protected connect_strings SqlCn;
              string CnString;
    protected System.Web.UI.WebControls.TextBox TextBox1;
    DataSet objDataSet = new DataSet();
      

  2.   

    private void Page_Load(object sender, System.EventArgs e) 
    {
    Class1 TestClass=new Class1();
    TestClass.TestString="fjdkls;a";            
    CnString=SqlCn.SQLConnectionString;
    if (!this.IsPostBack)
    {
    CreateDataSet();
    intiTree(TreeView1.Nodes,0);
    }
    }
    private void intiTree(TreeNodeCollection Nds , int parentId)
        {
    DataView dv=new DataView() ;
                //DataRowView drv;
    TreeNode tmpNd;
    int strId;
    dv.Table = objDataSet.Tables["TREE_INFO"];
    dv.RowFilter = "PARENTID='" + parentId + "'"; 

    foreach(DataRowView objRow in dv)
    {
                    tmpNd=new TreeNode();
    strId=(int)objRow["NODEID"];
    tmpNd.ID=strId.ToString();
    tmpNd.Text=objRow["NODENAME"].ToString();
    tmpNd.ExpandedImageUrl =objRow["ImgEx"].ToString();
    tmpNd.ImageUrl=objRow["Img"].ToString() ;
    tmpNd.NavigateUrl =objRow["Adderss"].ToString() ;
    Nds.Add(tmpNd);
    intiTree(Nds[Nds.Count-1].Nodes,strId);               
    }           
        }
     private void CreateDataSet() 
     {
                SqlConnection objCn=new SqlConnection(CnString);
    objCn.Open();
    string strSql  ="select * from TREE_INFO";
    SqlDataAdapter objAdapter=new SqlDataAdapter(strSql,objCn);
                objAdapter.Fill(objDataSet,"TREE_INFO");
     }
    }目录树结点的增加
    单纯在Treeview 上增加、删除、修改节点只需用Nodes属性的Add、 Remove、等方法即可,值得注意的地方是VS.NET中Treeview的Nodes集合与VS6.0中的区别,VS6.0中的是一个大的集合,而VS.NET中的是分层的每个Node下都有Nodes属性。增加、删除、修改树节点时与VS6.0相比有很大差别,特别是删除时。
    下面是增加和删除的代码:
             private void BtnAdd_Click(object sender, System.EventArgs e)
    {
    TreeNode NdSel;
    TreeNode tmpNd=new TreeNode();
                  tmpNd.Id= GetNewId()
    NdSel = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex);
                  tmpNd.Text = "新节点" ;
                  NdSel.Nodes.Add(tmpNd);
    } private void BtnDel_Click(object sender, System.EventArgs e)
    {
    TreeNode NdSel;
    TreeNode tmpNd=new TreeNode();
    NdSel = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex);
    tmpNd.Text = "新节点" ;
    NdSel.Remove();
    }移动目录树结点:
    由于服务器控件不支持鼠标拖动事件,所以不能象Windows程序那样通过拖动移动节点,这里是通过选择父节点的方式。移动是通过在原位置删除,新位置添加实现的,要注意在删除时先保存节点信息。
      

  3.   

    建树的基本思路是:从根节点开始递归调用显示子树 
    private void InitTree(TreeNodeCollection Nds,int parentId)
    {
    DataView dv=new DataView();
    TreeNode tmpNd ;
    int intId;
    dv.Table=ds.Tables["tree"];
    dv.RowFilter=" parentnode=" + parentId + " and nodenum > 0";
    foreach(DataRowView drv in dv)
    {
    tmpNd = new TreeNode();
    tmpNd.Tag=int.Parse(drv["nodenum"].ToString().Trim()); 
    tmpNd.Text=drv["nodelabel"].ToString().Trim();
    if(int.Parse(drv["nodetype"].ToString().Trim()) == 1)
    {
    tmpNd.ImageIndex = 0 ;
    tmpNd.SelectedImageIndex = 1 ;
    }
    else
    {
    tmpNd.ImageIndex = 2 ;
    tmpNd.SelectedImageIndex = 3 ;
    }
    Nds.Add(tmpNd);
    intId=int.Parse(drv["parentnode"].ToString().Trim());
    InitTree(tmpNd.Nodes,int.Parse(drv["nodenum"].ToString().Trim()));
    }
      

  4.   

    http://www.chinabs.net/aspnet/default.asp?infoid=68