从数据库读取出来的菜单(动态菜单),如何实现,点击菜单前面的+/-或点击该菜单的图片,或者点击文字都可以自动打开或者收缩菜单呢?现在就只能点击+/-才能打开和收缩..郁闷中...请教高手..附上
代码如下:请高手指点,最好能有源代码...<%@ Page Language="C#" AutoEventWireup="true" CodeFile="数据库动态树型菜单-Tree.aspx.cs" Inherits="Tree" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TreeView ID="tvMenu" Font-Size="12px" runat="server" BackColor="#E0E0E0" CollapseImageUrl="~/Tree/Plusbox.gif" ExpandDepth="1" ExpandImageUrl="~/Tree/Minusbox.gif" NodeIndent="10" NoExpandImageUrl="~/Tree/Minusbox.gif" ShowLines="True" Width="202px" LineImagesFolder="~/TreeLineImages" OnSelectedNodeChanged="tvMenu_SelectedNodeChanged">
            <ParentNodeStyle Font-Bold="False" ImageUrl="~/Tree/hintBehavior.gif" />
            <HoverNodeStyle BackColor="#8080FF"
                Font-Underline="True" Font-Size="Larger" />
            <SelectedNodeStyle Font-Underline="True" HorizontalPadding="0px" VerticalPadding="0px" BackColor="#FFE0C0" />
            <RootNodeStyle ImageUrl="~/Tree/22.gif" />
            <NodeStyle Font-Names="Verdana" Font-Size="12pt" HorizontalPadding="0px"
                NodeSpacing="0px" VerticalPadding="0px" />
            <LeafNodeStyle ChildNodesPadding="0px" ImageUrl="~/Tree/iconedit.GIF" />
        </asp:TreeView>
    
    </div>
    </form>
</body>
</html>
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;public partial class Tree : System.Web.UI.Page
{    SqlConnection Conn = new SqlConnection("server=LOO;database=Tree;uid=sa;pwd=immenseloo");
    DataSet ds = new DataSet();    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {            this.createDataSet();
            this.InitTree(tvMenu.Nodes, "0");
        }
    }
    private void createDataSet()
    {        try
        {       
                Conn.Open();
                string sqlStr = "select * from tbTree ";
                SqlDataAdapter cmdSelect = new SqlDataAdapter(sqlStr, Conn);
                cmdSelect.Fill(ds, "Tree");
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
            Response.End();
        }
        finally
        {
            Conn.Close();
        }     }
    protected void InitTree(TreeNodeCollection Nds, string parentId)//用递归方法动态生成节点
    {
        DataView dv = new DataView();
        TreeNode tmpNode;
        dv.Table = ds.Tables["Tree"];
        dv.RowFilter = "ParentId=" + "'" + parentId + "'";
        foreach (DataRowView drv in dv)
        {
            tmpNode = new TreeNode();
            tmpNode.Value = drv["Id"].ToString();
            tmpNode.Text = drv["Context"].ToString();
            tmpNode.NavigateUrl = drv["url"].ToString(); ;
            Nds.Add(tmpNode);
            this.InitTree(tmpNode.ChildNodes, tmpNode.Value);
        }
    }
    protected void tvMenu_SelectedNodeChanged(object sender, EventArgs e)
    {
        //Response.Write("adfdf");
    }}

解决方案 »

  1.   

    动态构造的时候制定该节点的功能 tmpNode.SelectAction = TreeNodeSelectAction.Expand;
      

  2.   

    http://www.cnblogs.com/gzhnan/articles/1047986.html
    http://www.cnblogs.com/dnmidi/archive/2007/12/01/979710.html
      

  3.   

    我建议楼主使用js控件,动态加载数,这个方法还支持异步调用,csdn旁边的树就是用的这个原理。几十万个节点都没有问题!MzTreeView
    示例  
    <script language="JavaScript"
       src="http://www.meizz.com/Web/Plugs/MzTreeView10.js"></script>
    <base href="http://www.meizz.com/Web/">
    <style>
    A.MzTreeview
    {
       font-size: 9pt;
       padding-left: 3px;
    }
    </style>
    <script language="JavaScript">
       var tree = new MzTreeView("tree");   tree.icons["property"] = "property.gif";
       tree.icons["css"] = "collection.gif";
       tree.icons["book"]   = "book.gif";
       tree.iconsExpand["book"] = "bookopen.gif"; //展开时对应的图片   tree.setIconPath("http://www.meizz.com/Icons/TreeView/"); //可用相对路径   tree.nodes["0_1"] = "text:WEB 编程";
       tree.nodes["1_100"] = "text:代码示例; data:id=100"; 
       tree.nodes["1_200"] = "text:梅花雪脚本控件集; data:id=200";
       tree.nodes["1_310"] = "text:CSS; icon:css; data:id=310"; 
       tree.nodes["1_320"] = "text:DHTML; data:id=320"; 
       tree.nodes["1_300"] = "text:HTML; data:id=300"; 
       tree.nodes["1_400"] = "text:JavaScript; icon:book; data:id=400";
       tree.nodes["320_322"] = "text:属性; icon: property; data:id=322"; 
       tree.nodes["320_323"] = "text:方法; data:id=323"; 
       tree.nodes["320_324"] = "text:事件; icon:event; data:id=324"; 
       tree.nodes["320_325"] = "text:集合; data:id=325"; 
       tree.nodes["400_407"] = "text:对象; data:id=407"; 
       tree.nodes["400_406"] = "text:方法; data:id=406"; 
       tree.nodes["400_408"] = "text:运算符; data:id=408"; 
       tree.nodes["400_409"] = "text:属性; data:id=409"; 
       tree.nodes["407_1140"] = "text:Date; url:Article.asp; data:id=140";
       tree.nodes["406_1127"] = "text:toString; url:Article.asp; data:id=127";
       tree.nodes["408_1239"] = "text:||; url:Article.asp; data:id=239";
       tree.nodes["409_1163"] = "text:E;  url:Article.asp; data:id=163";   tree.setURL("Catalog.asp");
       tree.setTarget("MzMain");
       document.write(tree.toString());     //亦可用 obj.innerHTML = tree.toString();
    </script>
    控件下载:http://www.meizz.com/Web/Download/MzTreeView10.rar