在一般的网站中浏览类别的用户控件通常都位于大多数 ASP.NET 页的左边,它使用户能够按类别快速的查找产品。最近遇到一个客户,因为在他网站上展示的产品并不多,所以要求在原有类别浏览的基础上将产品也加进去。一来更方便,二来加长了左部导航栏的长度使页面更协调。原有的分类导航栏是由Repeater实现的,现在需要在每一个分类下加入该类的商品信息,于是我想到了在原有Repeater中嵌套Repeater。实现界面如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default4.aspx.cs" Inherits="Default4" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<style type="text/css">
<!--
body {font-size: 12px;}
-->
</style>
</head>
<body>
<form id="form1" runat="server">
<h3 align="center">在Repeater中嵌套使用Repeater </h3>实现界面如下:<br />
<br />
<div>
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<HeaderTemplate>
<TABLE borderColor=#e5e3e3 cellSpacing=0 cellPadding=3 width=790 align=center border=1>
</HeaderTemplate>
<ItemTemplate>
<!--分类名称-->
<TR><TD align="left" width=200><%#Eval("Assort_title")%></TD> </TR>
<!--分类下所属的产品-->
<asp:Repeater ID="Repeater2" runat="server">
<ItemTemplate>
<TR><TD align="center" width=200><a href="#"><!--传<%#Eval("Assort_id")%>链接到另一页面--><%#Eval("Assort_title")%></a></TD> </TR>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
<FooterTemplate>
</TABLE>
</FooterTemplate>
</asp:Repeater>
</div>
友情提示:此示例有数据库 源本是:Assort.sql
</form>
</body>
</html>
后台事件代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//------导包
using System.Text;
using System.Data.SqlClient;
using System.Collections.Generic;
public partial class Default4 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("server=(local);database=aben;uid=sa;pwd=sa;");
SqlDataAdapter adapter = new SqlDataAdapter("select * from assort where assort_level = 1", con);
DataSet ds = new DataSet();
adapter.Fill(ds, "assort");
Repeater1.DataSource = ds;
Repeater1.DataBind();
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//BLL.Products products = new BLL.Products();
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Repeater rep = (Repeater)e.Item.FindControl("Repeater2");
//找到分类Repeater关联的数据项
DataRowView row = (DataRowView)e.Item.DataItem;
//提取分类ID
int Id = Convert.ToInt32(row["Assort_id"]);
//根据分类ID查询该分类下的产品,并绑定产品Repeater
rep.DataSource = this.Getlist(Id);
rep.DataBind();
}
}
//考虑到代码简洁与清晰 这里就不分层了
public IList<Assort> Getlist(int nid)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select * from assort");
strSql.Append(" where Assort_nid=" + nid);
strSql.Append(" order by assort_id desc");
//一般是按时间字段降序排列的 本表中没有时间字段就以ID为准
IList<Assort> assorts = new List<Assort>();
SqlConnection con = new SqlConnection("server=(local);database=aben;uid=sa;pwd=sa;");
con.Open();
SqlCommand cmd = new SqlCommand(strSql.ToString(), con);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Assort model = new Assort();
model.Assort_id = int.Parse(reader["Assort_id"].ToString());
model.Assort_nid = int.Parse(reader["Assort_nid"].ToString());
model.Assort_title = reader["Assort_title"].ToString();
model.Assort_level = int.Parse(reader["Assort_level"].ToString());
assorts.Add(model);
}
return assorts;
}
}
实体Assort.cs:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// Assort 的摘要说明
/// </summary>
public class Assort
{
public Assort()
{
}
private int _assort_id;
private int _assort_nid;
private string _assort_title;
private int _assort_level;
/// <summary>
/// 序号自动增加列
/// </summary>
public int Assort_id
{
get { return _assort_id; }
set { _assort_id = value; }
}
/// <summary>
/// 所属序号
/// </summary>
public int Assort_nid
{
get { return _assort_nid; }
set { _assort_nid = value; }
}
/// <summary>
/// 标题信息
/// </summary>
public string Assort_title
{
get { return _assort_title; }
set { _assort_title = value; }
}
/// <summary>
/// 分类级别
/// </summary>
public int Assort_level
{
get { return _assort_level; }
set { _assort_level = value; }
}
}
数据库源本:
USE PUBS
GO
--无限级分类表
CREATE TABLE Assort
(
Assort_id INT IDENTITY(1,1) PRIMARY KEY, --序号 自动增加列
Assort_nid INT NOT NULL, --所属序号
Assort_title VARCHAR(50) NOT NULL, --标题信息
Assort_level INT NOT NULL --分类级别
)
GO
SELECT * FROM Assort
--一极标题
INSERT INTO Assort VALUES(0,'新闻',1)
INSERT INTO Assort VALUES(0,'邮箱',1)
INSERT INTO Assort VALUES(0,'博客',1)
--二极标题所属新闻
INSERT INTO Assort VALUES(1,'八卦新闻',2)
INSERT INTO Assort VALUES(1,'国内新闻',2)
INSERT INTO Assort VALUES(1,'国际新闻',2)
--二极标题所属邮箱
INSERT INTO Assort VALUES(2,'免费邮箱',2)
INSERT INTO Assort VALUES(2,'会员邮箱',2)
INSERT INTO Assort VALUES(2,'企业邮箱',2)
--二极标题所属博客
INSERT INTO Assort VALUES(3,'个人博客',2)
INSERT INTO Assort VALUES(3,'趣味博客',2)
INSERT INTO Assort VALUES(3,'媒体博客',2)
--三四级分类依次类推掌握设计原理就OK
--查看所有的数据
SELECT * FROM Assort