从数据库读取出来的菜单(动态菜单),如何实现,点击菜单前面的+/-或点击该菜单的图片,或者点击文字都可以自动打开或者收缩菜单呢?现在就只能点击+/-才能打开和收缩..郁闷中...请教高手..附上
代码如下:请高手指点,最好能有源代码...<%@ 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");
    }}