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

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

     

  • 相关阅读:
    自动检查出修改的代码 shell 做升级包 供观摩
    mysql 复制数据库
    docker 容器 日志占用空间过大问题处理
    react native ios启动指定模拟器
    React-Native Navigator-this.props.navigation....
    react-native 适配问题
    vsCode 开发微信小程序插件
    React-Native Navigator 过渡动画卡顿的解决方案
    JavaScript运行机制
    npm install Unexpected token in JSON at position XXX
  • 原文地址:https://www.cnblogs.com/willpan/p/Repeater.html
Copyright © 2020-2023  润新知