這幾天一直打算作個從數據讀取導航菜單的效果,之前作的時候都是寫死的(太死了),好了話很少說,先看效果!html
我是個小菜,高手請不要噴!我在網上查了很久,說用menu控件,可是我用了不太好!最後我決定用repeater的嵌套來實現這個效果。先數據庫結構吧!數據庫
前臺的代碼:ui
1 <body> 2 <form id="form1" runat="server"> 3 <div class="menu"> 4 <ul class="nav"> 5 <asp:Repeater ID="rptNav" runat="server" OnItemDataBound="rptNav_ItemDataBound"> 6 <ItemTemplate> 7 <li><a href='<%# DataBinder.Eval(Container.DataItem,"navUrl")%>'> 8 <%# DataBinder.Eval(Container.DataItem,"navTitle") %></a> 9 <asp:Repeater ID="rptSub" runat="server"> 10 <HeaderTemplate> 11 <ul class="sub-nav"> 12 </HeaderTemplate> 13 <ItemTemplate> 14 <li><a href='<%# DataBinder.Eval(Container.DataItem,"navUrl")%>'> 15 <%# DataBinder.Eval(Container.DataItem,"navTitle") %></a></li> 16 </ItemTemplate> 17 <FooterTemplate> 18 </ul> 19 </FooterTemplate> 20 </asp:Repeater> 21 </li> 22 </ItemTemplate> 23 </asp:Repeater> 24 </ul> 25 </div> 26 </form> 27 </body> 28 </html>
後臺的實現:spa
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data.SqlClient; using System.Data; namespace LearnTest { public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { InitData(); } } /// <summary> /// 初始化數據 /// </summary> private void InitData() { SqlConnection cn = new SqlConnection(@"server=(local);uid=sa;pwd=xjai18749695757;database=Test"); SqlDataAdapter da = new SqlDataAdapter("select * from nav where parentId = 0",cn); DataSet ds = new DataSet(); cn.Open(); //打開數據庫鏈接 da.Fill(ds); rptNav.DataSource = ds.Tables[0].DefaultView; rptNav.DataBind(); cn.Close(); } //綁定一級菜單時綁定二級菜單 protected void rptNav_ItemDataBound(object sender, RepeaterItemEventArgs e) { //判斷repeater的數據綁定列 if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem) { //當前一級菜單的ID string id = ((DataRowView)(e.Item.DataItem)).Row["Id"].ToString(); //找到下面的repeater控件 Repeater rpt = (Repeater)e.Item.FindControl("rptSub"); if (rpt!=null) { SqlConnection cn = new SqlConnection(@"server=(local);uid=sa;pwd=123456;database=Test"); SqlCommand cmd = new SqlCommand("select * from nav where parentId =@parentId",cn); cmd.Parameters.Add("@parentId",SqlDbType.VarChar,11).Value = id; cn.Open(); rpt.DataSource = cmd.ExecuteReader(); rpt.DataBind(); cn.Close(); } } } } }
這就是用repeater進行嵌套來進行實現的!code