您的位置:首页 > 其它

动态实现树形菜单

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

原理大概是这样的:

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

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

是否循环出来

看看代码吧

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

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 string, out 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("");
}
}
这样点开的时候在刷新页面也不会隐藏了....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: