刚开始学习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;
}
在这里起到抛砖引玉的作用,希望大神能够不耻下问,完善。
原文地址:https://www.cnblogs.com/imPedro/p/9271303.html