剛開始學習Asp.net做網站的時候, 做的是一個電子圖書購買網站,發現圖書有多級類目。 例如:小說分類下面世界名著,中國古典小說....... 文學類目下有 文學理論 中國古典詩歌。 這些要是直接寫死在網站裏面的話,不利於後面去添加和修改分類,這樣做的話是非常不利於後期網站維護的。那麼有什麼辦法把兩級分類數據都通過去後臺輸入,前臺去讀取呢?也就是這些分類存在數據庫中,實現動態讀取。
找了些資料,然後我整合下,終於可以應用到自己的網站了。 用的是Listview或者datalist嵌套。我這裏就用我的圖書網站爲例。 用datalist實現二級嵌套。
實現原理 是在pageload 事件下加載一級分類, 然後在一級分類datalist1的onitemdatabound事件下去讀取一級分類的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
{
}
//這是datalist1的DataList1_ItemDataBound 事件的代碼
//千萬不要寫在page—load裏面直接綁定哦。
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;
}
在這裏起到拋磚引玉的作用,希望大神能夠不恥下問,完善。