动态实现树形菜单
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("");
}
}
这样点开的时候在刷新页面也不会隐藏了....
原理大概是这样的:
第一步:需要把一级到四级样式写好,位置固定好
第二步:动态循环生成菜单,一级正常动态循环出来,二级到四级根据参数传递过来的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("");
}
}
这样点开的时候在刷新页面也不会隐藏了....
相关文章推荐
- JAVASCRIPT + PHP 应用二:网页设计中树形菜单的动态实现
- dtree实现动态加载树形菜单,动态插入树形菜单
- JavaScript + PHP 应用二:网页设计中树形菜单的动态实现
- 如何实现动态树形菜单
- jQuery ztree实现动态树形多选菜单
- dhtmlxTree+struts2实现简单的动态树形菜单
- Ztree树形菜单实现动态初始化、添加、删除、修改节点
- JQuery实现动态生成树形菜单
- JQuery实现动态生成树形菜单
- extjs springMVC实现动态树形菜单
- dtree实现动态加载树形菜单,动态插入树形菜单
- javascript树形菜单(一):Tigra Tree Menu,实现动态数据加载
- 动态树形菜单的实现
- 动态实现树形菜单(使用dtree控件)
- JSP 实现动态树形菜单
- Vue2组件tree实现无限级树形菜单
- jQuery 实现 checkbox的树形菜单结构(2)
- 前端框架 zTree 从数据库中动态加载树形菜单
- c#从数据库读取数据动态生成树形菜单
- 树形菜单js实现