您的位置:首页 > 数据库

两个Repeater嵌套实现动态菜单(ado.net+sql和xml+Linq两种读取数据方式)

2011-07-25 17:58 961 查看
今天在实现一个增强web项目可扩展性的一个功能,把以前的静态菜单改成了动态的扩展、可维护的菜单

1、菜单存储在数据表中

<asp:Repeater ID="Repeater1" runat="server"
onitemdatabound="Repeater1_ItemDataBound">
<ItemTemplate>
<h1 class="type"><a href="javascript:void(0)"><%# DataBinder.Eval(Container.DataItem, "MT_name")%></a></h1>
<asp:Repeater ID="Repeater2" runat="server">
<HeaderTemplate>
<div class="content">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="images/menu_topline.gif" width="182" height="5"/></td>
</tr>
</table>
<ul class="MM">
</HeaderTemplate>
<ItemTemplate>
<li><a href="<%# DataBinder.Eval(Container.DataItem, "MI_page")%>" target="main"><%# DataBinder.Eval(Container.DataItem, "MI_name")%></a></li>
</ItemTemplate>
<FooterTemplate>
</ul></div>
</FooterTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>


 服务器端代码

publicpartialclass left : System.Web.UI.Page
{
protectedvoid Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string sql ="select MT_ID,MT_name from ModuleTopInfo";
SqlDbHelper db =new SqlDbHelper();//SqlHelper类你懂得
Repeater1.DataSource =db.ExecuteDataTable(sql);
Repeater1.DataBind();
}
}

protectedvoid Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
string id = ((DataRowView)e.Item.DataItem).Row["MT_ID"].ToString();
Repeater rpt = (Repeater)e.Item.FindControl("Repeater2");
string sql ="select MI_ID,MI_page,MI_name from ModuleInfo where MT_ID=@id";
SqlParameter[] parameters =new SqlParameter[] {
new SqlParameter("@id",id)
};
SqlDbHelper db =new SqlDbHelper();
DataTable dt =new DataTable();
dt = db.ExecuteDataTable(sql,CommandType.Text,parameters);
if (rpt !=null)
{
rpt.DataSource = dt;
rpt.DataBind();
}
}
}


 实现效果截图

View Code

<asp:Repeater ID="Repeater1" runat="server"
onitemdatabound="Repeater1_ItemDataBound">
<ItemTemplate>
<tr>
<td class="menu_first_img mouse" id="td<%# DataBinder.Eval(Container.DataItem, "id") %>" onClick="show(<%# DataBinder.Eval(Container.DataItem, "id") %>)"><div class="menu" ><a href="#"  style=" color:White; text-decoration:none">
<%# DataBinder.Eval(Container.DataItem, "Text")%>
</a> </div></td>
</tr>
<tr>
<td id="show<%# DataBinder.Eval(Container.DataItem, "id") %>" style=" display:none;" ><table width="100%" border="0" cellspacing="0" cellpadding="0">
<asp:Repeater ID="Repeater2" runat="server">
<ItemTemplate>
<tr>
<td class="left"><table width="100%" height="24" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="40" align="center"><img src="../images/5.png" alt="1" width="16" height="16"></td>
<td><div class="menu1"><a href="<%# DataBinder.Eval(Container.DataItem, "url")%>" style=" color:White; text-decoration:none">
<%# DataBinder.Eval(Container.DataItem, "menuText")%>
</a> </div></td>
</tr>
</table></td>
</tr>
</ItemTemplate>
</asp:Repeater></table></td></tr>
</ItemTemplate>
</asp:Repeater>


后台代码

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string path = Server.MapPath("~/Manger/MenuXML/admin.xml");
XElement root = XElement.Load(path);
var result = from menu in root.Elements("Menus")
select new
{
Text = menu.Attribute("Text").Value,
ID = menu.Attribute("id").Value
};
Repeater1.DataSource = result;
Repeater1.DataBind();
}

}

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
string id = DataBinder.Eval(e.Item.DataItem, "id").ToString();
Repeater rpt = (Repeater)e.Item.FindControl("Repeater2");
string path = Server.MapPath("~/Manger/MenuXML/admin.xml");
XElement root = XElement.Load(path);
var result = from menu in root.Descendants("MenuItem")
where menu.Attribute("id").Value.Equals(id)
select new
{
menuText = menu.Attribute("Text").Value,
url = menu.Attribute("url").Value,
curid = menu.Attribute("id").Value
};
if (rpt != null)
{
rpt.DataSource = result;
rpt.DataBind();
}
}
}


实现截图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: