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

 

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

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

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

   先看看效果图

一.数据库设计

扫描二维码关注公众号,回复: 1898019 查看本文章

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;

    }

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

 

猜你喜欢

转载自www.cnblogs.com/imPedro/p/9271303.html