动态实现树形菜单

      树形菜单在开发软件和网站中经常用到,但是会遇到一个问题,在网站中当你点开的时候,由于页面刷新了,又合起来来了,这种问题是用iframe不会出现,但是在网站中很少会用到框架,最近就碰到了这样的问题,在网上找了很多js写的树形菜单,我需要分四级,但是都没找到合适的,乱七八糟的代码都有,很头疼,没办法,自己就想办法写了一个,这个是在知道分几级的情况下,关于无限极没研究,可以再基础上在下点功夫也可以!

原理大概是这样的:

第一步:需要把一级到四级样式写好,位置固定好

第二步:动态循环生成菜单,一级正常动态循环出来,二级到四级根据参数传递过来的id与上一级别的id判断是否相等来判断

           是否循环出来

看看代码吧

树形菜单是个公用的部分,我们一般会放到用户控件里,代码如下:

 

View Code
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="protype.ascx.cs" Inherits="Cms.Web.control.protype" %>
                <div class="zy_con_l">
             <div class="zy_con_ltt">品牌展示</div>
            <div class="zy_ppzslb">
                <ul>
                   <%
                    Cms.BLL.Channel bll = new Cms.BLL.Channel();
                    System.Data.DataSet dt = bll.GetList(" KindId=1 and ParentId=0");
                    if (dt.Tables[0].Rows.Count != 0)
                    {
                        foreach (System.Data.DataRow row in dt.Tables[0].Rows)
                        {
                            string title = row["title"].ToString();
                            int id = Convert.ToInt32(row["Id"].ToString());
                     %>
                    <li><a href='ProductList.aspx?classId=<%=id %>'><%=title%></a>
                        <ul>
                        <%
                            if (Request.QueryString["classId"] != null && Request.QueryString["classid"].ToString() == id.ToString())
{

    System.Data.DataSet dt2 = bll.GetList(" KindId=1 and ParentId=" + id);
    if (dt2.Tables[0].Rows.Count != 0)
    {
        foreach (System.Data.DataRow row2 in dt2.Tables[0].Rows)
        {
            string title2 = row2["title"].ToString();
            int id2 = Convert.ToInt32(row2["Id"].ToString());
                                    
                                 %>
                            <li><a href='ProductList.aspx?classId=<%=id %>&classId2=<%=id2 %>'><%=title2%></a>
                                <ul>
                                 <%
            if (Request.QueryString["classId2"] != null && Request.QueryString["classId2"].ToString() == id2.ToString())
{
                        
System.Data.DataSet dt3 = bll.GetList(" KindId=1 and ParentId=" + id2);
if (dt3.Tables[0].Rows.Count != 0)
{

    foreach (System.Data.DataRow row3 in dt3.Tables[0].Rows)
    {
        string title3 = row3["title"].ToString();
        int id3 = Convert.ToInt32(row3["Id"].ToString());
                                     %>
                                    <li><a href='ProductList.aspx?classId=<%=id %>&classId2=<%=id2 %>&classId3=<%=id3 %>'><%=title3%></a>
                                        <ul>
                                        <%
        if (Request.QueryString["classId3"] != null && Request.QueryString["classId3"].ToString() == id3.ToString())
{                                         
System.Data.DataSet dt4 = bll.GetList(" KindId=1 and ParentId=" + id3);
if (dt4.Tables[0].Rows.Count != 0)
{

    foreach (System.Data.DataRow row4 in dt4.Tables[0].Rows)
    {
        string title4 = row4["title"].ToString();
        int id4 = Convert.ToInt32(row4["Id"].ToString());
                                     %>
                                            <li><a href='ProductList.aspx?classId=<%=id %>&classId2=<%=id2 %>&classId3=<%=id3 %>&classId4=<%=id4 %>'><%=title4%></a></li>
                                          <%}
}
} %>
                                        </ul>
                                    </li>
                                   <%}
}
} %>
                                </ul>
                            </li>
                        <%}
    }
    } %>
                        </ul>
                    </li>
                    <%
}
                        
                    }%>
                </ul>
            </div>
        </div>

 引用的页面里

 

View Code
<head runat="server">
   <title>佳音琴行</title>
<link href="images/style.css" rel="stylesheet" type="text/css" />
<link href="images/zy_home.css" rel="stylesheet" type="text/css" />
<style> 

*{ margin:0; padding:0;}
li{ list-style:none; line-height:28px;}
a{text-decoration:none;color:#343434;border:none;}
a:hover{text-decoration:none; color:#F00;}
.zy_ppzslb{width:208px; background:url(images/zy_ppzs_lbbg.gif) repeat-y; font:"宋体"; font-size:12px; float:left; padding-top:8px;}
.zy_ppzslb ul{ padding-left:15px; overflow:hidden;}
.zy_ppzslb ul li{ background:url(images/yi.gif) no-repeat 0 7px; text-indent:15px;}
.zy_ppzslb ul li ul li{ background:url(images/xtb2.gif) no-repeat 0 9px; text-indent:12px;}
.zy_ppzslb ul li ul li ul li{ background:url(images/sj.gif) no-repeat 0 9px; text-indent:12px;}
.zy_ppzslb ul li ul li ul li ul li{ background:url(images/xtb3.gif) no-repeat 0 10px; text-indent:8px;}
</style>



</head>
<body>
    <form id="form1" runat="server">
  <table width="990" border="0" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF" align="center" style="margin:0 auto;">
  <tr>
    <td align="left" valign="top">
        <uc1:protype ID="protype1" runat="server" />
    </td>
    <td align="left" valign="top">
        <div class="zy_con_r">
            <div class="zy_con_rtt"><p>品牌展示</p><span>您当前位置:首页>品牌展示</span></div>
            <ul class="zy_ppzs_bot">
             <asp:Repeater ID="rptList" runat="server">
           <ItemTemplate>
                <li><a href='<%=GetUrl() %>id=<%#Eval("Id")%>' class="zy_ppzs_bot_pic"><img src='<%#Eval("ImgUrl") %>'  alt='<%#Eval("Title")%>'/></a><p class="zy_ppzs_bot_lbwz"><a href='ProductView.aspx?id=<%#Eval("Id")%>'>品牌:<%#Eval("Title")%><br>型号:<%#Eval("ModelType") %></a></p></li>

           </ItemTemplate>
            </asp:Repeater>
            </ul>
              <div class="spClear">
          <asp:Label ID="lbmsg" runat="server"></asp:Label>
      </div>
            <div class="fenye"
             <webdiyer:aspnetpager ID="AspNetPager1" runat="server" CssClass="formfield" 
            CustomInfoClass="formbutton" 
            CustomInfoHTML="第&lt;font color='red'&gt;&lt;b&gt;%CurrentPageIndex%&lt;/b&gt;&lt;/font&gt;页 共%PageCount%&nbsp;页 %StartRecordIndex%-%EndRecordIndex%" 
            CustomInfoTextAlign="Center" FirstPageText="首页" horizontalalign="Center" 
            InputBoxStyle="width:19px" LastPageText="尾页" meta:resourceKey="AspNetPager1" 
            NextPageText="下一页" PageSize="15" 
            PrevPageText="前一页" showcustominfosection="Left" ShowInputBox="Always" 
            ShowNavigationToolTip="True" style="FONT-SIZE: 12px" 
            SubmitButtonClass="formfield" SubmitButtonText="GO" width="506px" 
            onpagechanging="AspNetPager1_PageChanging" PageIndexBoxType="TextBox" 
                    ShowPageIndexBox="Never" AlwaysShow="True">
        </webdiyer:aspnetpager></div>
        </div>
    </td>
  </tr>
</table>

    </form>
</body>
</html>

 

后台代码:

 

View Code
 public partial class ProductList1 : System.Web.UI.Page
    {
        public int pcount = 0//总条数
        public int classId;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!int.TryParse(Request.Params["classId"as stringout this.classId))
            {
                this.classId = 0;
            }
            if (!Page.IsPostBack)
            {
                this.lbmsg.Visible = false;
                RptBind("");
            }
            if ((Request.Params["classId"] != null) && (Request.Params["classId"].ToString() != ""))
            {
                classId = Convert.ToInt32(Request.Params["classId"].ToString());
                if ((Request.Params["classId2"] != null) && (Request.Params["classId2"].ToString() != ""))
                {
                    classId = Convert.ToInt32(Request.Params["classId2"].ToString());
                    if ((Request.Params["classId3"] != null) && (Request.Params["classId3"].ToString() != ""))
                    {
                        classId = Convert.ToInt32(Request.Params["classId3"].ToString());
                        if ((Request.Params["classId4"] != null) && (Request.Params["classId4"].ToString() != ""))
                        {
                            classId = Convert.ToInt32(Request.Params["classId4"].ToString());
                        }
                    }
                }
                RptBind("ClassId in (" + GetAllId(classId) + ")");
            }
        }


        public string GetUrl()
        {
            string url = "ProductView.aspx?";
            if ((Request.Params["classId"] != null) && (Request.Params["classId"].ToString() != ""))
            {
                url+= "&classId="+Request.Params["classId"].ToString();
            }
            if ((Request.Params["classId2"] != null) && (Request.Params["classId2"].ToString() != ""))
            {
                url += "&classId2=" + Request.Params["classId2"].ToString();
            }
            if ((Request.Params["classId3"] != null) && (Request.Params["classId3"].ToString() != ""))
            {
                url += "&classId3=" + Request.Params["classId3"].ToString();
            }
            if ((Request.Params["classId4"] != null) && (Request.Params["classId4"].ToString() != ""))
            {
                url += "&classId4=" + Request.Params["classId4"].ToString();
            }
            url += "&";
            return url;
        }
        /// <summary>
        
/// 获得下级的所有id
        
/// </summary>
        System.Text.StringBuilder str = new System.Text.StringBuilder();
        int fag = 0;
        protected string GetAllId(int classid)
        {
            if(fag==0)
            {
            str.Append(classid+",");
            }
            Cms.BLL.Channel bll = new BLL.Channel();
            DataSet ds = bll.GetList(" KindId=1 and ParentId="+classid);
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                fag = 1;
                int id = Convert.ToInt32(row["Id"].ToString());
                str.Append(id + ",");
                GetAllId(id);
            }
            return str.ToString().Remove(str.ToString().LastIndexOf(","));
        }


        #region 列表绑定
        private void RptBind(string strWhere)
        {
            Cms.BLL.ProductInfo bll = new Cms.BLL.ProductInfo();
            DataSet ds = bll.GetList(strWhere);
            DataView dv = ds.Tables[0].DefaultView;
            //利用PAGEDDAGASOURCE类来分页
            PagedDataSource pds = new PagedDataSource();
            AspNetPager1.RecordCount = dv.Count;
            pds.DataSource = dv;
            pds.AllowPaging = true;
            pds.CurrentPageIndex = AspNetPager1.CurrentPageIndex - 1;
            pds.PageSize = AspNetPager1.PageSize;
            //获得总条数
            pcount = bll.GetCount(strWhere);
            if (this.pcount < 0)
            {
                this.lbmsg.Visible = true;
                this.lbmsg.Text = "暂时没有产品";
            }
            //绑定数据
            rptList.DataSource = pds;
            rptList.DataBind();
        }
        #endregion

        protected void AspNetPager1_PageChanging(object src, Wuqi.Webdiyer.PageChangingEventArgs e)
        {
            AspNetPager1.CurrentPageIndex = e.NewPageIndex;
            RptBind("");
        }
    }

这样点开的时候在刷新页面也不会隐藏了....

posted @ 2012-05-12 14:32  双魂人生  阅读(5487)  评论(0编辑  收藏  举报