嵌套Repeater运用实例

最近做一个销售数据统计功能,从中发现Repeater的确是一个很灵活的数据控件,尤其是它那强大的模板功能。

一点实践心得记录在此,望指摘。

1.首先是关于Repeater深入理解的两个推荐

a.认清控件之DataBind》作者:君之蘭 这篇博文深入的记录了Repeater控件的数据绑定过程,值得学习。

b.数据绑定--Repeater, DataList, or GridView?作者:GWP_Brian.net

2.实例需求介绍

从上图中可以看出,功能是以时间为条件进行统计。显示的数据装在3个Repeater控件中,因为这里的表头是动态加载的,所以有一个特殊的Repeater2。

3.实例代码解析
前台代码:

View Code
 1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="MultiRepeater.aspx.cs" Inherits="MultiRepeater" %>
2
3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml">
5 <head runat="server">
6 <title>嵌套Repeater</title>
7 <link title="Style" href="Style.css" rel="stylesheet" type="text/css" />
8 </head>
9 <body>
10 <form id="form1" runat="server">
11 <div>
12 <table width="100%" border="0" cellspacing="0" cellpadding="0" class="Main_List_Table"
13 rules="none">
14 <tr class="Main_List_Table_Tr1">
15 <td width="15%">
16 日期
17 </td>
18 <td width="15%">
19 网上零售额
20 </td>
21 <asp:Repeater ID="rpt_Pro_Class" runat="server">
22 <ItemTemplate>
23 <td>
24 <%--动态生成表头:商品类名--%>
25 <%#(System.Data.DataRowView(Container.DataItem))["ClassName"]%>(件)
26 </td>
27 </ItemTemplate>
28 </asp:Repeater>
29 </tr>
30 <asp:Repeater ID="rpt_Order_Date" runat="server">
31 <ItemTemplate>
32 <tr onmouseover="this.className='Main_List_Table_Tr_Over'" onmouseout="this.className='Main_List_Table_Tr_Out'">
33 <td>
34 <%--日期--%>
35 <%# (System.Data.DataRowView(Container.DataItem))["Order_Date"]%>
36 </td>
37 <td>
38 <%--调用一个函数,统计金额--%>
39 <%# get_Order_Pro_Money(Eval("Order_Date").ToString())%>
40 </td>
41 <asp:Repeater ID="rpt_Pro_Class_" runat="server">
42 <ItemTemplate>
43 <td>
44 <%--调用一个函数,统计商品数量--%>
45 <%# get_Pro_Class_Sales_Count(Eval("Order_Date").ToString(), Eval("ClassId").ToString())%>
46 </td>
47 </ItemTemplate>
48 </asp:Repeater>
49 </tr>
50 </ItemTemplate>
51 </asp:Repeater>
52 </table>
53 </div>
54 </form>
55 </body>
56 </html>

从前台代码很容易看出数据显示在页面的结构。

注意:这里没有直接用<%# Eval("XXXX") %>的方式绑定数据,这种绑定方式在性能上比较差。

后台代码(仅供参考):

View Code
  1 using System;
2 using System.Collections;
3 using System.Configuration;
4 using System.Data;
5 using System.Linq;
6 using System.Web;
7 using System.Web.Security;
8 using System.Web.UI;
9 using System.Web.UI.HtmlControls;
10 using System.Web.UI.WebControls;
11 using System.Web.UI.WebControls.WebParts;
12 using System.Xml.Linq;
13 using System.Data.SqlClient;
14
15 public partial class MultiRepeater : System.Web.UI.Page
16 {
17 SqlConnection _conn = CommFun.CreateConn();
18 protected void Page_Load(object sender, EventArgs e)
19 {
20 //连接打开
21 _conn.Open();
22
23 if (!IsPostBack)
24 {
25 //获取页面输入值
26 //sel_Time:开始时间,sel_Timend:结束时间
27 this.sel_Time.Text = CommFun.GetFirstDayOfMonth(DateTime.Now).ToString("yyy-MM-dd");
28 this.sel_Timend.Text = DateTime.Now.ToString("yyy-MM-dd");
29
30 //【表头数据】商品类型绑定
31 pro_Class_Bind();
32 //【表内容数据】日期绑定
33 rpt_Order_Date_Bind();
34 }
35 }
36
37 ///<summary>
38 /// 【表头数据】商品类型绑定
39 ///</summary>
40 protected void pro_Class_Bind()
41 {
42 SqlDataReader Sdr = new SqlCommand("Select * From Pro_Class ", Conn).ExecuteReader();
43 this.rpt_Pro_Class.DataSource = Sdr;
44 this.rpt_Pro_Class.DataBind();
45 Sdr.Close();
46 }
47
48 ///<summary>
49 /// 【表内容数据】日期绑定
50 ///</summary>
51 protected void rpt_Order_Date_Bind()
52 {
53 ……
54 //页面数据格式转换
55 DateTime sel_Time = Convert.ToDateTime(this.sel_Time.Text);
56 DateTime sel_Timend = Convert.ToDateTime(this.sel_Timend.Text);
57 DateTime this_Time = sel_Timend;
58
59 //创建表实例
60 DataTable Dt = new DataTable();
61 //创建日期列
62 Dt.Columns.Add("Order_Date");
63 Dt.Rows.Add();
64 //将结束时间作为第一行第一列的值
65 Dt.Rows[0][0] = this_Time.ToString("yyy-MM-dd");
66
67 int i = 0;
68 int ii = 1;
69 //遍历所有需要的日期并加入Dt中
70 while (i == 0)
71 {
72 this_Time = this_Time.AddDays(-1);
73 if (this_Time >= sel_Time)
74 {
75 Dt.Rows.Add();
76 Dt.Rows[ii][0] = this_Time.ToString("yyy-MM-dd");
77 ii++;
78 }
79 else
80 {
81 i = 1;
82 }
83 }
84 this.rpt_Order_Date.DataSource = Dt;
85 this.rpt_Order_Date.DataBind();
86
87 for (int iii = 0; iii < this.rpt_Order_Date.Items.Count; iii++)
88 {
89 Repeater rpt_Pro_Class_ = (Repeater)this.rpt_Order_Date.Items[iii].FindControl("rpt_Pro_Class_");
90
91 //【表内容数据】各个商品的数量
92 rpt_Pro_Class__Bind(Dt.Rows[iii]["Order_Date"].ToString(), rpt_Pro_Class_);
93 }
94 }
95
96 ///<summary>
97 /// 【表内容数据】各个商品的数量
98 /// 这里主要是给Repeater绑定日期和商品类型编号
99 /// 便于以后针对每个类型的商品进行统计
100 ///</summary>
101 ///<param name="Order_Date">日期</param>
102 ///<param name="rpt_Pro_Class_">Repeater控件</param>
103 protected void rpt_Pro_Class__Bind(string Order_Date, Repeater rpt_Pro_Class_)
104 {
105 DataTable Dt = new DataTable();
106 Dt.Columns.Add("Order_Date");
107 Dt.Columns.Add("ClassId");
108 int ii = 0;
109 SqlDataReader Sdr = new SqlCommand("Select * From Pro_Class", Conn).ExecuteReader();
110 while (Sdr.Read())
111 {
112 Dt.Rows.Add();
113 Dt.Rows[ii][0] = Order_Date;
114 Dt.Rows[ii][1] = Sdr["ClassId"].ToString();
115 ii++;
116 }
117 Sdr.Close();
118 rpt_Pro_Class_.DataSource = Dt;
119 rpt_Pro_Class_.DataBind();
120 }
121
122 ///<summary>
123 /// 统计商品数量
124 ///</summary>
125 ///<param name="sel_Time">日期</param>
126 ///<param name="ClassId">商品类型编号</param>
127 ///<returns></returns>
128 protected string get_Pro_Class_Sales_Count(string sel_Time, string ClassId)
129 {
130 //根据页面传回的参数进行统计
131
132 ……
133 }
134
135 ///<summary>
136 /// 金额统计
137 ///</summary>
138 ///<param name="Order_Date">日期</param>
139 ///<returns></returns>
140 protected string get_Order_Pro_Money(string Order_Date)
141 {
142 //根据页面传回的参数进行统计
143
144 ……
145 }
146 }

至此实例运用结束。其实最后发现用两个Repeater也可以,不过自己的实践,暂且还是记录在这吧!

-----------------------------------------------------诚在交流,旨在提高,欢迎拍砖----------------------------------------------------------

 

posted @ 2011-09-29 18:15  WILLPAN  阅读(2088)  评论(11编辑  收藏  举报