zoukankan      html  css  js  c++  java
  • 嵌套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也可以,不过自己的实践,暂且还是记录在这吧!

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

     

  • 相关阅读:
    Android自定义之仿360Root大师水纹效果
    Android之TextView的Span样式源码剖析
    Android之TextView的样式类Span的使用详解
    随着ScrollView的滑动,渐渐的执行动画View
    仿微信主界面导航栏图标字体颜色的变化
    android自定义之 5.0 风格progressBar
    Android性能优化之内存篇
    Android性能优化之运算篇
    How to install Zabbix5.0 LTS version with Yum on the CentOS 7.8 system?
    How to install Zabbix4.0 LTS version with Yum on the Oracle Linux 7.3 system?
  • 原文地址:https://www.cnblogs.com/willpan/p/Repeater.html
Copyright © 2011-2022 走看看