菜单导航数据库中读取 菜单导航类似于http://www.nopcommerce-demo.com/Default.aspx 分类Categories导航 注意是从数据库里选出。当单击computers从数据库里读取它的子类desktops,notebooks等等显示在下面 请大家帮帮忙 一直想做这个导航,先谢谢大家了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你去www.cnblogs.com看看金色海洋写的一个专题----自定义的角色权限 这个其实原理和treeview差不多..同样用到递归取数据,取子类,实现无限级要类.在网上找一下treeview的那些参考代码.再变换到你那种导航上来 .net 3.5框架下用linq可以直接将数据库中读取的内容...进行灵活使用...来最终最为一个datasource来使用... 这是我自己写的一个Menu控件,从数据库中读取的。效果如下://动态生成菜单 //添加“首页”菜单 MenuItem itemshouye = new MenuItem(); itemshouye.Text = "首页 "; itemshouye.NavigateUrl = "Default.aspx"; itemshouye.Target = "_blank"; Menu1.Items.Add(itemshouye); bjs007.typeDataTable typetable = tb.gettype();//这里是顶级菜单的DataTable for (int i = 0; i < typetable.Rows.Count; i++) { bjs007.typeRow typerow=(bjs007.typeRow)typetable.Rows[i]; MenuItem item = new MenuItem(); item.Text = typerow.type.Trim(); item.Target = "_blank"; if (typerow.moban != "type.aspx") { item.NavigateUrl = typerow.moban; } else { item.NavigateUrl = typerow.moban + "?typeid=" + typerow.id.ToString(); } bjs007.lmDataTable lmtable = lb.GetLmByTypeid(typerow.id);//这里是子菜单的DataTable for (int j = 0; j < lmtable.Rows.Count; j++) { bjs007.lmRow lmrow = (bjs007.lmRow)lmtable.Rows[j]; MenuItem itemzi = new MenuItem(); itemzi.Text = lmrow.name.Trim(); itemzi.NavigateUrl = lmrow.moban.Trim()+"?lmid="+lmrow.id.ToString(); itemzi.Target = "_blank"; item.ChildItems.Add(itemzi); } Menu1.Items.Add(item); }希望这个代码对你有所帮助! 先分析一下,不要管url重写那部分,从浏览器进行传值。菜单可以用Repeater(显示主分类)+Repeater(显示子分类)如点击Computers传Category.aspx?id=30点Desktops传Desktops.aspx?id=50这里假设类别表Category的表结构为:id cname parentid29 Books 030 Computers 050 DeskTops 30很容易得到DeskTops的父级分类为Computers,再次假设分类只是2级,那就好办多了(不需要递归)//这里是伪代码,请自己更改sql="select * from Category where id="+Request.QueryString["id"].ToString();DataTable dt = db.ExecuteTable(sql);if(dt.Rows.Count>0){ String pid = dt.Rows[0]["parentid"].ToString(); if(pid=="0")//证明当前分类为主分类 { } else//当前分类为子分类 { }}大致这样判断.. 我知道了 做出效果来了 用两个嵌套的repeater实现了 谢谢大家的指点。<div> <ul> <asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Repeater1_ItemDataBound"> <ItemTemplate> <li><a href='test.aspx?departmentid=<%# Eval("departmentid") %>'><%#Eval("Name") %></a> <ul> <asp:Repeater ID="rep" runat="server"> <ItemTemplate> <li><a href='test.aspx?Categoryid=<%# Eval("categoryid") %>'><%#Eval("Name") %></a> </ItemTemplate> </asp:Repeater></ul> </li> </ItemTemplate> </asp:Repeater> </ul> </div> protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { Repeater1.DataSource = CatalogAccess.GetDepartments(); Repeater1.DataBind(); } } protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { RepeaterItem item =e.Item; DataRowView drv = (DataRowView)item.DataItem; if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { Repeater rpt = (Repeater)item.FindControl("rep"); string departmentId = Convert.ToString(drv.Row["DepartmentId"]); if (departmentId != null) { rpt.DataSource = CatalogAccess.GetCategoriesInDepartment(departmentId); rpt.DataBind(); } } } asp.net 如何将html生成图片? FreeTextBox的使用 简单的javascript问题 如何解决iis过载的问题 如何在DataGrid中的特定行加入删除按钮? 请大家帮忙修改一下这个正则表达式 如何给动态加载的数据应用样式??? 如何彻底防止冲击波震荡波(win2000上.网自动重启死机) .NET中使用GridView控件,再用<PagerTemplate>模版做分页功能,可是在浏览器中显示不出<PagerTemplate>中所有的控件 同一个Fragment用两个GirdView问题 求助!制作仿GOOGLE智能搜索框时碰到的问题 模板页里如何使用javascript
这是我自己写的一个Menu控件,从数据库中读取的。
效果如下://动态生成菜单
//添加“首页”菜单
MenuItem itemshouye = new MenuItem();
itemshouye.Text = "首页 ";
itemshouye.NavigateUrl = "Default.aspx";
itemshouye.Target = "_blank";
Menu1.Items.Add(itemshouye);
bjs007.typeDataTable typetable = tb.gettype();//这里是顶级菜单的DataTable
for (int i = 0; i < typetable.Rows.Count; i++)
{
bjs007.typeRow typerow=(bjs007.typeRow)typetable.Rows[i];
MenuItem item = new MenuItem();
item.Text = typerow.type.Trim();
item.Target = "_blank";
if (typerow.moban != "type.aspx")
{
item.NavigateUrl = typerow.moban;
}
else
{
item.NavigateUrl = typerow.moban + "?typeid=" + typerow.id.ToString();
}
bjs007.lmDataTable lmtable = lb.GetLmByTypeid(typerow.id);//这里是子菜单的DataTable
for (int j = 0; j < lmtable.Rows.Count; j++)
{
bjs007.lmRow lmrow = (bjs007.lmRow)lmtable.Rows[j];
MenuItem itemzi = new MenuItem();
itemzi.Text = lmrow.name.Trim();
itemzi.NavigateUrl = lmrow.moban.Trim()+"?lmid="+lmrow.id.ToString();
itemzi.Target = "_blank";
item.ChildItems.Add(itemzi);
}
Menu1.Items.Add(item);
}希望这个代码对你有所帮助!
如点击Computers传Category.aspx?id=30
点Desktops传Desktops.aspx?id=50这里假设类别表Category的表结构为:
id cname parentid
29 Books 0
30 Computers 0
50 DeskTops 30
很容易得到DeskTops的父级分类为Computers,再次假设分类只是2级,那就好办多了(不需要递归)
//这里是伪代码,请自己更改
sql="select * from Category where id="+Request.QueryString["id"].ToString();
DataTable dt = db.ExecuteTable(sql);
if(dt.Rows.Count>0)
{
String pid = dt.Rows[0]["parentid"].ToString();
if(pid=="0")//证明当前分类为主分类
{
}
else//当前分类为子分类
{
}
}
大致这样判断..
<div>
<ul>
<asp:Repeater ID="Repeater1" runat="server"
onitemdatabound="Repeater1_ItemDataBound">
<ItemTemplate>
<li><a href='test.aspx?departmentid=<%# Eval("departmentid") %>'><%#Eval("Name") %></a>
<ul> <asp:Repeater ID="rep" runat="server">
<ItemTemplate>
<li><a href='test.aspx?Categoryid=<%# Eval("categoryid") %>'><%#Eval("Name") %></a>
</ItemTemplate>
</asp:Repeater></ul>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
</div>
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Repeater1.DataSource = CatalogAccess.GetDepartments();
Repeater1.DataBind();
}
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
RepeaterItem item =e.Item;
DataRowView drv = (DataRowView)item.DataItem;
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater rpt = (Repeater)item.FindControl("rep");
string departmentId = Convert.ToString(drv.Row["DepartmentId"]);
if (departmentId != null)
{
rpt.DataSource = CatalogAccess.GetCategoriesInDepartment(departmentId);
rpt.DataBind(); }
}
}