Asp.net 用datalist嵌套的方法实现二级菜单的分类导航

 

          刚开始学习Asp.net做网站的时候, 做的是一个电子图书购买网站,发现图书有多级类目。   例如:小说分类下面世界名著,中国古典小说.......  文学类目下有 文学理论 中国古典诗歌。 这些要是直接写死在网站里面的话,不利于后面去添加和修改分类,这样做的话是非常不利于后期网站维护的。那么有什么办法把两级分类数据都通过去后台输入,前台去读取呢?也就是这些分类存在数据库中,实现动态读取。

   找了些资料,然后我整合下,终于可以应用到自己的网站了。  用的是Listview或者datalist嵌套。我这里就用我的图书网站为例。 用datalist实现二级嵌套。  

  实现原理    是在pageload 事件下加载一级分类然后在一级分类datalist1onitemdatabound事件下去读取一级分类的id , 然后根据一级分类的id 去检索二级分类的id (外键),当二级分类的id(等于)一级分类的id时候,把数据库中的数据绑定到二级分类的datalist2上。

   先看看效果图



 

 

 

一.数据库设计

1.  数控库设计


TypeOne 一级分类数据库表

ID   int       主键

BookTypeOne      char 一级分类名


TyperTwo (二级分类数据库表)

ID      int 主键

BookType   char 二级分类名

IDno        int 一级分类名(外键)

Bookinfo图书信息表

Bookid  int  主键

BookType   char  外键


二     前台ASPX代码

  首先在前台aspx页面嵌套两个datalist 

代码:     

    <asp:DataList ID="DataList1" runat="server" 

        onitemdatabound="DataList1_ItemDataBound"> 

        <ItemTemplate>

            <asp:Label ID="Label1" runat="server"  Visible="false" 

                Text='<%# Eval("ID") %>' />

            <asp:Label ID="BookTypeOneLabel" runat="server" 

                Text='<%# Eval("BookTypeOne") %>'  />

            <asp:DataList ID="DataList2" runat="server"    >

            <ItemTemplate>

               <asp:Label ID="BookTypeOneLabe2" runat="server" 

                Text='<%# Eval("BookType") %>' />

            </ItemTemplate>

            </asp:DataList>

 

 

        </ItemTemplate>

            </asp:DataList>

三.后台代码:在页面加载的时候他要先加载一级分类

 

protected void Page_Load(object sender, EventArgs e)

    {

 

        try

        {

            SqlDataReader read;

            string sql = " SELECT *from TypeOne";

            DB db = new DB();   

            SqlConnection cnn = db.ConnectionCnnString1;

            read = db.SelectTable(sql);

            DataList1.DataSource = read;

            DataList1.DataBind();

        }

 

        catch (Exception ex)

        {

            Response.Write("查询失败" + ex.Message);

 

        }

        finally

        {

 

        }

 

 

   //这是datalist1DataList1_ItemDataBound 事件的代码

  //千万不要写在pageload里面直接绑定哦。

  protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)

    {

 

        SqlDataReader read;

        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)

        {

            DataList myDataList1 = (DataList)e.Item.FindControl("DataList2");

            //提取一级分类ID

          string id= ((Label)e.Item.FindControl("Label1")).Text;

          //一级分类的id与二级分类idno(外键)匹配

          string sql = "SELECT BookType from TyperTwo where TyperTwo.IDno=" + id;

            //把sql语句传到DB类查询

            DB db = new DB();

            SqlConnection cnn = db.ConnectionCnnString1;

            read = db.SelectTable(sql);

            myDataList1.DataSource = read;

            myDataList1.DataBind();

      

 

        }

 

 

    }

 

 

 四.数据库DB.cs类代码

//声明连接属性

public SqlConnection ConnectionCnnString1

    {

        get

        {

            string constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

            cnn = new SqlConnection(constr);

            cnn.Open();

            return cnn;

 

        }

}

    //查询方法,这个方法只需要接收传过来sql语句

    public SqlDataReader SelectTable(string sql)

    {

        if (cnn.State == ConnectionState.Closed)

        {

            cnn.Open();

        }

        cmd = new SqlCommand(sql, cnn);

        read = cmd.ExecuteReader();

        return read;

    }

在这里起到抛砖引玉的作用,希望大神能够不耻下问,完善。

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值