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;

    }

在這裏起到拋磚引玉的作用,希望大神能夠不恥下問,完善。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章