用TreeView实现树菜单  --------------------------------------------------------------------------------
源作者:追风                   人气:11398  
 
   
  
 手机参与:    
 
             
   
 
  具体方法是:创建一个数据库,设计树图信息表S_Menu,包含NodeId、ParentId、NodeName、Address、Icon字段,其它字段根据实际业务而定,节点名称NodeName将在树型控件的节点上显示,NodeId字段保存节点的唯一标识号,ParentId表示当前节点的父节点号,标识号组成了一个“链表”,记录了树上节点的结构。设计一个Web窗体其上放置TreeView控件,修改其属性Id为tvMenu。数据结构如下:
CREATE TABLE [dbo].[S_Menu] (
 [NodeId] [char] (6) COLLATE Chinese_PRC_CI_AS NULL ,
 [ParentId] [char] (6) COLLATE Chinese_PRC_CI_AS NULL ,
 [NodeName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [Address] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [Icon] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
GO数据库如下:
NodeId ParentId NodeName Address  Icon
100000 0  公共查询部   icon_document.gif
100001 100000  人民币日报查询 public/a1.aspx icon_settings.gif
100002 100000  外币日报查询 public/a2.aspx icon_settings.gif
100003 0  分行科技部   icon_document.gif
100004 100003  人民币日报查询 tech/a1.aspx icon_settings.gif
100005 100003  外币日报查询 tech/a2.aspx icon_settings.gif
100006 0  福田支行   icon_document.gif
100007 100006  月存款进度表 a1.aspx  icon_settings.gif
100008 100006  月存款走势图 a2.aspx  icon_settings.gif
100009 0  罗湖支行   icon_document.gif
100010 100009  月存款进度表 a1.aspx  icon_settings.gif
100011 100009  月存款走势图 a2.aspx  icon_settings.gif
    
menu_left.aspx文件如下:
<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Page language="c#" Codebehind="menu_Left.aspx.cs" AutoEventWireup="false" Inherits="hzquery.menu.menu_Left" %>
<HTML>
 <HEAD>
  <title>menu_Left</title>
  <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
  <meta name="CODE_LANGUAGE" Content="C#">
  <meta name="vs_defaultClientScript" content="JavaScript">
  <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
 </HEAD>
 <body MS_POSITIONING="GridLayout">
  <form id="menu_Left" method="post" runat="server">
   <iewc:TreeView id="tvMenu" runat="server"></iewc:TreeView>
  </form>
 </body>
</HTML>CodeBehind代码如下:
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 hzquery.menu
{
 /// <summary>
 /// menu_Left 的摘要说明。
 /// </summary>
 public class menu_Left : System.Web.UI.Page
 {
  protected Microsoft.Web.UI.WebControls.TreeView tvMenu;
  SqlConnection Conn;
  SqlDataAdapter myCmd;
  DataSet ds;
  string cmdSelect;  private void Page_Load(object sender, System.EventArgs e)
  {
   Conn=new SqlConnection(Application["ConnString"].ToString());
   CreateDataSet();
   InitTree(tvMenu.Nodes,"0");
  }
  //建立数据集
  private DataSet CreateDataSet()
  {
   cmdSelect="select * from S_Menu";
   myCmd=new SqlDataAdapter(cmdSelect,Conn);
   ds=new DataSet();
   myCmd.Fill(ds,"tree");
   return ds;
  }
  //建树的基本思路是:从根节点开始递归调用显示子树 
         private void InitTree(TreeNodeCollection Nds,string parentId)
  {
   DataView dv=new DataView();
   TreeNode tmpNd;
   string intId;
   dv.Table=ds.Tables["tree"];
   dv.RowFilter="ParentId="" + parentId + """ ;
   foreach(DataRowView drv in dv)
   {
    tmpNd=new TreeNode();
    tmpNd.ID=drv["NodeId"].ToString();
    tmpNd.Text=drv["NodeName"].ToString();
    tmpNd.ImageUrl="../images/"+drv["Icon"].ToString();
    tmpNd.NavigateUrl="../"+drv["Address"].ToString();
    Nds.Add(tmpNd);
    intId=drv["ParentId"].ToString();
    InitTree(tmpNd.Nodes,tmpNd.ID);
   }
  }  #region Web Form Designer generated code
  override protected void OnInit(EventArgs e)
  {
   InitializeComponent();
   base.OnInit(e);
  }
  private void InitializeComponent()
  {    
   this.Load += new System.EventHandler(this.Page_Load);  }
  #endregion
 }
}
 

解决方案 »

  1.   

    http://61.149.49.140/down.rar
    控件库及例子
      

  2.   

    转贴
    下载地址:
    http://msdn.microsoft.com/downloads/samples/internet/ASP_DOT_NET_ServerControls/WebControls/default.asp安装方法:(也可参照Readme.txt)
    1.bulid.将bulid.bat的路径指向csc.exe所在路径,生成Microsoft.Web.UI.WebControls.dll。
    2.在wwwroot下创建空目录webctrl_client\1_0。
    3.将build\Runtime下的文件拷至webctrl_client\1_0下。
    4.选择工具箱的自定义工具箱,添加Microsoft.Web.UI.WebControls.dll。=======================
    树形图用于显示按照树形结构进行组织的数据,其用途比较广泛,如计算机中的文件系统(Windows中的资源管理器)、企业或公司的组成结构等。我们知道在Windows下VB、PB、Delphi等工具提供了一个功能很强的树型控件TreeView,利用Treeview控件可以方便地开发树形图。然而在网页上实现树形图就不那么容易了,现在在ASP.NET中利用微软提供的Internet Explorer WebControls它使得网页上的树形图开发与在Windows下一样的方便,一样的功能强大,甚至更灵活。 
      本文介绍用Internet Explorer WebControls开发树形图的方法,由于树形图结构较复杂,使用起来常不知如何下手。笔者结合最近刚为公司用ASP.NET编写的应用程序管理器这一具体实例,详细阐述在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控件就出现在工具箱中了。 
      一、树的建立 
      具体方法是:创建一个数据库,设计树图信息表TREE_INFO,包含NODEID、PARENTID、NODENAME、ADDERSS、ICON字段,其它字段根据实际业务而定,节点名称NODENAME将在树型控件的节点上显示,NODEID字段保存节点的唯一标识号,PARENTID表示当前节点的父节点号,标识号组成了一个“链表”,记录了树上节点的结构。设计一个Web窗体其上放置TreeView控件。
      
    Private Sub CreateDataSet()’建立数据集 
    Dim myConn As New SqlConnection() 
    Dim myCmd As New SqlCommand("select NODEID,NODENAME,PARENTID,ADDRESS,ICON from Tree_info", myConn) 
    Dim myDataAdapter As New SqlDataAdapter() 
    myConn.ConnectionString = Application("connectstring") 
    myCmd.CommandText = "" 
    myCmd.Connection = myConn 
    myDataAdapter.SelectCommand = myCmd 
    myDataAdapter.Fill(ds, "tree") 
    End Sub 
      建树的基本思路是:从根节点开始递归调用显示子树 
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    CreateDataSet() 
    intiTree(TreeView1.Nodes, 0) 
    End Sub 
    Private Sub intiTree(ByRef Nds As TreeNodeCollection, ByVal parentId As Integer) 
    Dim dv As New DataView() 
    Dim drv As DataRowView 
    Dim tmpNd As TreeNode 
    Dim intId As Integer 
    dv.Table = ds.Tables("tree") 
    dv.RowFilter = "PARENTID=’" & parentId & "’" 
    For Each drv In dv 
    tmpNd = New TreeNode() 
    strId = drv("NODE_ID") 
    tmpNd.ID = strId 
    tmpNd.Text = drv("NODE_NAME ") 
    tmpNd.ImageUrl = drv("ICON").ToString 
    Nds.Add(tmpNd) 
    intiTree(Nds(Nds.Count - 1).Nodes, intId) 
    Next 
    End Sub  
    二、增加、删除树节点 
      单纯在Treeview 上增加、删除、修改节点只需用Nodes属性的Add、 Remove、等方法即可,值得注意的地方是VS.NET中Treeview的Nodes集合与VS6.0中的区别,VS6.0中的是一个大的集合,而VS.NET中的是分层的每个Node下都有Nodes属性。增加、删除、修改树节点时与VS6.0相比有很大差别,特别是删除时。
    Private Sub ButAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButAdd.Click’在选定的节点下添加子节点 
    Dim tmpNd As New TreeNode(), NdSel As TreeNode 
    tmpNd.ID = GetNewId() 
    NdSel = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex)’选中的节点 
    tmpNd.Text = "新节点" 
    NdSel.Nodes.Add(tmpNd) 
    Dim myRow As DataRow 
    myRow = ds.Tables("tree").NewRow() 
    myRow("NODE_NAME") = tmpNd.ID 
    myRow("NODE_DESCRIPT") = "新节点" & tmpNd.ID & "_" & NdSel.ID 
    myRow("PARENT_NAME") = NdSel.ID 
    ds.Tables("tree").Rows.Add(myRow) 
    End Sub 
    Private Sub ButDele_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButDele.Click’删除选中的节点 
    Dim idx As String = TreeView1.SelectedNodeIndex() 
    GetNdCol(idx).Remove(TreeView1.GetNodeFromIndex(idx)) 
    Dim dv As New DataView(), recNo As Integer 
    dv.Table = ds.Tables("tree") 
    dv.RowFilter= "NODEID=" & NdId 
    dv.Delete(0) 
    End Sub 
    Private Function GetNdCol(ByVal idx As String) As TreeNodeCollection 
    ‘获得选中节点的父节点的Nodes集合 
    Dim cnt As Integer, i As Integer 
    Dim tmpNds As TreeNodeCollection 
    Dim idxs() As String 
    idxs = Split(idx, ".") 
    cnt = UBound(idxs) 
    If cnt = 0 Then 
    tmpNds = TreeView1.Nodes 
    Else 
    tmpNds = TreeView1.Nodes(CInt(idxs(0))).Nodes 
    For i = 1 To cnt - 1 
    tmpNds = tmpNds(CInt(idxs(i))).Nodes 
    Next 
    End If 
    Return tmpNds 
    End Function 
    三、修改、移动树节点 
      由于服务器控件不支持鼠标拖动事件,所以不能象Windows程序那样通过拖动移动节点,这里是通过选择父节点的方式。移动是通过在原位置删除,新位置添加实现的,要注意在删除时先保存节点信息。 
    Private Sub TreeView1_SelectedIndexChange(ByVal sender As Object, ByVal e As Microsoft.Web.UI.WebControls.TreeViewSelectEventArgs) Handles TreeView1.SelectedIndexChange 
    Dim dv As New DataView() 
    dv.Table = ds.Tables("tree") 
    Dim tmpNd As TreeNode = TreeNdSel(e.OldNode), tmpNds As TreeNodeCollection 
    dv.RowFilter= "NODEID=" & tmpNd.ID 
    dv(0)("NODE_DESCRIPT") = Me.TextBox1.Text 
    dv(0)("ADDRESS") = Me.TextBox2.Text 
    dv(0)("TARGET") = Me.TextBox3.Text 
    dv(0)("ICON") = Me.TextBox4.Text 
    If dv(0)("PARENTID").ToString <> Me.DropDownList1.SelectedItem.Value Then 
    ‘移动节点 
    dv(0)("PARENT_NAME") = Me.DropDownList1.SelectedItem.Value 
    If Me.DropDownList1.SelectedItem.Value = "ROOT" Then 
    tmpNds = TreeView1.Nodes 
    Else 
    tmpNds = FromIdToNode(Me.DropDownList1.SelectedItem.Value, TreeView1.Nodes).Nodes’新的父节点的Nodes集合 
    End If 
    GetNdCol(e.OldNode).Remove(tmpNd) 
    tmpNds.Add(tmpNd) 
    End If 
    tmpNd.Text = Me.TextBox1.Text 
    tmpNd.ImageUrl = Me.TextBox4.Text 
    tmpNd = TreeView1.GetNodeFromIndex(TreeView1.SelectedNodeIndex) 
    dv.RowFilter= "NODEID=" & tmpNd.ID 
    Me.TextBox1.Text = dv(0)("NODENAME").ToString 
    Me.TextBox2.Text = dv(0)("ADDRESS").ToString 
    Me.TextBox3.Text = dv(0)("TARGET").ToString 
    Me.TextBox4.Text = dv(0)("ICON").ToString 
    End Sub 
    Private Function FromIdToNode(ByVal ID As String, ByVal Nds As TreeNodeCollection) As TreeNode 
    ‘由关键字查找节点 
    Dim i As Integer 
    Dim tmpNd As TreeNode, tmpNd1 As TreeNode 
    For Each tmpNd In Nds 
    If tmpNd.ID = ID Then 
    Return tmpNd 
    Exit Function 
    End If 
    tmpNd1 = FromIdToNode(ID, tmpNd.Nodes) 
    If Not (tmpNd1 Is Nothing) Then 
    Return tmpNd1 
    Exit Function 
    End If 
    Next 
    Return Nothing 
    End Function