详解ASP.NET数据绑定操作中Repeater控件的用法

一、绑定控件之Repeater
.NET封装了多种数据绑定控件,诸如GridView、DataList等但该篇文章将会从Repeater入手,因为Repeater只提供了基本的数据绑定模板,没有内置其它分页等功能,所以它是最原始的数据绑定控件,只要能够熟练运用Repeater控件其它的绑定控件也就很简单了。
1、Repeater简介
Repeater 控件是基本模板化数据列表。 它不像GridView控件一样能够可视化的设计格式或样式,因此开发时在控件模板中必须显式声明所有格式、格式和样式标记。另外Repeater控件没有内置选择、排序、编辑、分页等功能,它只提供了基本的数据绑定,但是它为开发人员提供了ItemCommand 事件,该事件支持在控件中收发命令。
想要绑定数据,模板是必不可少的,Repeater控件同样支持数据模板,而且还可以在模板中添加想要的标签,它主要用法如下图:

Note:每个 Repeater 控件必须定义 ItemTemplate。

二、控件使用技巧
上文讲解了Repeater基本的使用方法及它的一些基本特性,接下来做几个经典的示例来运用Repeater控件。
1、数据绑定之删除、编辑
该示例将会使用Asp.net的前台和后台结合来实现显示数据,并能够编辑和删除数据。
删除页面:

编辑页面:

前台代码:在单击编辑按钮后将会进入编辑页面,页面是由两个Panel控件来控制,通过传递ID号的方式判断显示的是编辑页面还是删除页面,另外前台代码通过设置控件的CommandArgument属性来传递后台所需要判断的id号。

<body>
  <form id="form1" runat="server">
  <div>
    <asp:Repeater ID="userRepeat" runat="server" OnItemCommand="userRepeat_ItemCommand" OnItemDataBound="userRepeat_ItemDataBound">
      <HeaderTemplate>
        <table border="1" style="width:1000px;text-align:center;border-collapse:collapse;">
          <thead style="background-color:red;">
            <tr>
              <th>ID</th>
              <th>内容</th>
              <th>操作</th>
            </tr>
          </thead>
      </HeaderTemplate>
      <ItemTemplate>
        <asp:Panel ID="plItem" runat="server">
          <tr>
            <td><asp:Label runat="server" ID="lblID" Text='<%#Eval("id") %>'></asp:Label></td>
            <td><%#Eval("name") %></td>
            <td>
              <asp:LinkButton ID="lbtEdit" CommandName="Edit" CommandArgument='<%#Eval("id") %>' runat="server">编辑</asp:LinkButton>
              <asp:LinkButton ID="lbtDelete" CommandName="Delete" CommandArgument='<%#Eval("id") %>' runat="server">删除</asp:LinkButton>
            </td>
          </tr>
        </asp:Panel>
        <asp:Panel ID="plEdit" runat="server">
          <tr>
            <td><asp:Label runat="server" ID="Label1" Text='<%#Eval("id") %>'></asp:Label></td>
            <td><asp:TextBox ID="txtName" runat="server" Text='<%#Eval("name") %>'></asp:TextBox></td>
            <td>
              <asp:LinkButton ID="lbtCancel" CommandName="Cancel" CommandArgument='<%#Eval("id") %>' runat="server">取消</asp:LinkButton>
              <asp:LinkButton ID="lbtUpdate" CommandName="Update" CommandArgument='<%#Eval("id") %>' runat="server">更新</asp:LinkButton>
            </td>
          </tr>
        </asp:Panel>
      </ItemTemplate>
      <FooterTemplate>
        </table>
      </FooterTemplate>
    </asp:Repeater>
  </div>
  </form>
</body>

后台代码:在后台代码中很重要的两个事件是ItemCommand和ItemDataBound,其中ItemCommand负责接收前台传进来的按钮命令,根据命令的参数来设置后台传递的id,并在ItemDataBound中来验证id判断切换显示Panel。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; 

namespace WebApplication4
{
  public partial class EditPage : System.Web.UI.Page
  {
    private int id = 0; //保存指定行操作所在的ID号
    /// <summary>
    /// 窗体加载时绑定数据
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!Page.IsPostBack)
      {
        this.DataBindToRepeater();//将数据绑定到Repeater控件上
      }
    } 

    /// <summary>
    /// 将数据源绑定Repeater控件上
    /// </summary>
    private void DataBindToRepeater() {
      //使用using语句进行数据库连接
      using (SqlConnection sqlCon=new SqlConnection("server=.;database=MyBlog;uid=sa;pwd=1"))
      {
        sqlCon.Open(); //打开数据库连接 

        SqlCommand sqlcom = new SqlCommand();  //创建数据库命令对象
        sqlcom.CommandText = "select * from match"; //为命令对象指定执行语句
        sqlcom.Connection = sqlCon; //为命令对象指定连接对象 

        this.userRepeat.DataSource = sqlcom.ExecuteReader();  //为Repeater对象指定数据源
        this.userRepeat.DataBind(); //绑定数据源
      }
    } 

    /// <summary>
    /// Repeater控件命令事件
    /// </summary>
    /// <param name="source"></param>
    /// <param name="e"></param>
    protected void userRepeat_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
      //获取命令文本,判断发出的命令为何种类型,根据命令类型调用事件
      if (e.CommandName=="Edit") //编辑命令
      {
        id = int.Parse(e.CommandArgument.ToString());  //获取命令ID号
      }
      else if (e.CommandName=="Cancel")  //取消更新命令
      {
        id = -1;
      }
      else if(e.CommandName=="Delete")  //删除行内容命令
      {
        id = int.Parse(e.CommandArgument.ToString());  //获取删除行的ID号
        //删除选定的行,并重新指定绑定操作
        this.DeleteRepeater(id);
      }
      else if (e.CommandName == "Update") //更新行内容命令
      {
        //获取更新行的内容和ID号
        string strText = ((TextBox)e.Item.FindControl("txtName")).Text.Trim();
        int intId=int.Parse(((Label)e.Item.FindControl("lblID")).Text);
        //更新Repeater控件的内容
        this.UpdateRepeater(strText,intId);
      } 

      //重新绑定控件上的内容
      this.DataBindToRepeater();
    } 

    /// <summary>
    /// 删除行内容
    /// </summary>
    /// <param name="intId">删除行所在内容的ID</param>
    private void DeleteRepeater(int intId) {
      using (SqlConnection sqlCon = new SqlConnection("server=.;database=MyBlog;uid=sa;pwd=1"))
      {
        sqlCon.Open(); //打开数据库连接 

        SqlCommand sqlcom = new SqlCommand();  //创建数据库命令对象
        sqlcom.CommandText = "delete from match where id=@id"; //为命令对象指定执行语句
        sqlcom.Connection = sqlCon; //为命令对象指定连接对象 

        //创建参数集合,并向sqlcom中添加参数集合
        SqlParameter sqlParam = new SqlParameter("@id", intId);
        sqlcom.Parameters.Add(sqlParam); 

        sqlcom.ExecuteNonQuery();  //指定更新语句 

      }
    } 

    /// <summary>
    /// 更新Repeater控件中的内容
    /// </summary>
    /// <param name="strText">修改后的内容</param>
    /// <param name="intId">内容所在行的ID号</param>
    private void UpdateRepeater(string strText,int intId) {
      using (SqlConnection sqlCon = new SqlConnection("server=.;database=MyBlog;uid=sa;pwd=1"))
      {
        sqlCon.Open(); //打开数据库连接 

        SqlCommand sqlcom = new SqlCommand();  //创建数据库命令对象
        sqlcom.CommandText = "update match set name=@str where id=@id"; //为命令对象指定执行语句
        sqlcom.Connection = sqlCon; //为命令对象指定连接对象 

        //创建参数集合,并向sqlcom中添加参数集合
        SqlParameter[] sqlParam = { new SqlParameter("@str", strText), new SqlParameter("@id", intId) };
        sqlcom.Parameters.AddRange(sqlParam); 

        sqlcom.ExecuteNonQuery();  //指定更新语句 

      }
    } 

    /// <summary>
    /// Repeater控件数据绑定时发生的事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void userRepeat_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
      //判断Repeater控件中的数据是否是绑定的数据源,如果是的话将会验证是否进行了编辑操作
      //ListItemType 枚举表示在一个列表控件可以包括,例如 DataGrid、 DataList和 Repeater 控件的不同项目。
      if (e.Item.ItemType==ListItemType.Item || e.Item.ItemType==ListItemType.AlternatingItem)
      {
        //获取绑定的数据源,这里要注意上面使用sqlReader的方法来绑定数据源,所以下面使用的DbDataRecord方法获取的
        //如果绑定数据源是DataTable类型的使用下面的语句就会报错.
        System.Data.Common.DbDataRecord record = (System.Data.Common.DbDataRecord)e.Item.DataItem;
        //DataTable类型的数据源验证方式
        //System.Data.DataRowView record = (DataRowView)e.Item.DataItem; 

        //判断数据源的id是否等于现在的id,如果相等的话证明现点击了编辑触发了userRepeat_ItemCommand事件
        if (id == int.Parse(record["id"].ToString()))
        {
          ((Panel)e.Item.FindControl("plItem")).Visible = false;
          ((Panel)e.Item.FindControl("plEdit")).Visible = true;
        }
        else
        {
          ((Panel)e.Item.FindControl("plItem")).Visible = true;
          ((Panel)e.Item.FindControl("plEdit")).Visible = false;
        }
      }
    }
  }
}

2、分页--PageDataSource
前台代码:使用原始的html文本,并添加了一个Literal标签,用来动态添加并指定html标签。
页面截图:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <style type="text/css"> 

    .pageBar
    {
      margin-top: 10px;
    }
    .pageBar a
    {
      color: #333;
      font-size: 12px;
      margin-right: 10px;
      padding: 4px;
      border: 1px solid #ccc;
      text-decoration: none;
    }
  </style>
</head>
<body>
  <form id="form1" runat="server">
  <div> 

    <asp:Repeater ID="Repeater1" runat="server" >
      <HeaderTemplate>
        <table border="1" cellpadding="0" cellspacing="0" style="width:1006px;border-collapse:collapse; text-align:center;">
          <tr>
            <th style="background-color:red">ID</th>
            <th style="background-color:red">内容</th>
          </tr>
      </HeaderTemplate>
      <ItemTemplate>
        <tr>
          <td><asp:Label ID="lblId" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"id") %>' ></asp:Label></td>
          <td><%# DataBinder.Eval(Container.DataItem,"name") %></td>
        </tr>
      </ItemTemplate>
      <FooterTemplate>
        </table>
      </FooterTemplate>
    </asp:Repeater> 

  </div>
  <div class="pageBar">
    <asp:Literal ID="ltlPageBar" runat="server"></asp:Literal>
  </div>
  </form>
</body>
</html>

后台代码:Repeater控件的数据源是PagedDataSource对象,在页面加载时为该对象动态指定了分页的属性,并使用Literal标签来动态指定每个标签跳转页的链接。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; 

namespace WebApplication4
{
  public partial class PageDemo : System.Web.UI.Page
  {
    private string id = "";
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!Page.IsPostBack)
      {
        //设置当前页的索引
        int pageIndex = 1;
        try
        {
          //获取当前索要跳转页的索引号
          pageIndex = Convert.ToInt32(Request.QueryString["Page"]);
          //如果是第0页将会跳转入第1页
          if (pageIndex <= 0)
          {
            pageIndex = 1;
          }
        }
        catch
        {
          pageIndex = 1;
        } 

        DataTable dt = this.GetDataTable(); //获取绑定的数据表 

        PagedDataSource pds = new PagedDataSource();  //创建分页数据源对象
        pds.DataSource = dt.DefaultView;  //为数据源对象设置数据源
        pds.AllowPaging = true; //对象允许分页
        pds.PageSize = 2;  //设置对象每页显示的大小
        pds.CurrentPageIndex = pageIndex - 1; //设置数据源的当前页 

        //向Repeater控件上绑定分页数据源控件
        this.Repeater1.DataSource = pds;
        this.Repeater1.DataBind(); 

        //使用Literal标签来动态指定每个标签跳转页的链接
        ltlPageBar.Text = this.GetPageBar(pds);
      }
    } 

    /// <summary>
    /// 获取每个标签上的跳转页的链接地址
    /// </summary>
    /// <param name="pds">分页数据源对象</param>
    /// <returns>分页操作按钮的html文本</returns>
    private string GetPageBar(PagedDataSource pds)
    {
      string pageBar = string.Empty; //声明页面标签文本
      int currentPageIndex = pds.CurrentPageIndex + 1;  //获取当前页索引 

      //判断首页的链接页面
      if (currentPageIndex == 1) //如果该页为第一页,则证明它为首页
      {
        pageBar += "<a href=\"javascript:void(0)\">首页</a>";
      }
      else
      {
        //如果不是首页,首页链接的地址将会为1
        pageBar += "<a href=\"" + Request.CurrentExecutionFilePath + "?Page=1\">首页</a>";
      } 

      //判断上一页链接的地址
      if ((currentPageIndex - 1) < 1) //如果上一页小于1则链接到第一页
      {
        pageBar += "<a href=\"javascript:void(0)\">上一页</a>";
      }
      else
      {
        //如果上一页地址不是1将会链接到上一页
        pageBar += "<a href=\"" + Request.CurrentExecutionFilePath + "?Page=" + (currentPageIndex - 1) + "\">上一页</a>";
      } 

      //指定下一页的链接地址
      if ((currentPageIndex + 1) > pds.PageCount)
      {
        //如果下一页的地址大于总页数,将会连接到首页
        pageBar += "<a href=\"javascript:void(0)\">下一页</a>";
      }
      else
      {
        //否则的话链接到下一页
        pageBar += "<a href=\"" + Request.CurrentExecutionFilePath + "?Page=" + (currentPageIndex + 1) + "\">下一页</a>";
      } 

      //指定末页的链接地址
      if (currentPageIndex == pds.PageCount)
      {
        pageBar += "<a href=\"javascript:void(0)\">末页</a>";
      }
      else
      {
        pageBar += "<a href=\"" + Request.CurrentExecutionFilePath + "?Page=" + pds.PageCount + "\">末页</a>";
      } 

      return pageBar; //返回html文本
    } 

    /// <summary>
    /// 获取数据源,重新链接数据
    /// </summary>
    /// <returns>DataTable,数据源</returns>
    private DataTable GetDataTable()
    {
      DataTable dt = new DataTable(); //创建数据库表
      using (SqlConnection con = new SqlConnection("server=.;DataBase=MyBlog;uid=sa;pwd=1;"))
      { 

        con.Open(); //打开数据库链接 

        SqlCommand sqlCom = new SqlCommand();  //声明并创建数据库命令集
        StringBuilder sqlStr = new StringBuilder(); //声明sql语句
        sqlStr.Append("select * from match");  //获取sql语句 

        sqlCom.CommandText = sqlStr.ToString(); //为sqlcommand对象指定sql语句 

        sqlCom.Connection = con;  //为sqlcommand对象指定链接对象
        SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCom); //声明数据库适配器
        SqlCommandBuilder sqlBuilder = new SqlCommandBuilder(sqlDa);
        sqlDa.Fill(dt); //填充表
      } 

      return dt;
    } 

  }
}

结语
文章主要介绍了Repeater控件的基本使用方法,并通过两个示例来更深一步的学习了Repeater控件的使用。虽然Repeater控件封装的操作较少,但它是最基础的数据绑定控件,另外可以通过使用其它控件来弥补Repeater控件的不足,如可以通过使用PagedataSource类来实现数据的分页。文章写到这里并没有结束,下篇文章将会着重讨论ListView。

(0)

相关推荐

  • ASP.NET数据绑定GridView控件使用技巧

    不得不说GridView控件的功能确实很强大,一个简简单单的控件就可以把数据管理的很美.在这两天做的任务中碰到的一些GridView控件中遇到的问题进行总结: ①:在GridView控件中随意显示数据库中的信息: GridView控件中有一个AutoGenerateColumns属性,它的作用就是控制GridView控件是否在运行的时候自动生成相关联的列,一般情况下把这个属性设置成为false.因为我们需要的是一个DIY的GridView控件.然后点击右上角的箭头,选择编辑列添加一个BoundF

  • AspNetAjaxPager,Asp.Net通用无刷新Ajax分页控件,支持多样式多数据绑定

    本控件可以对GridView,Repeater,DataGrid,DataList...几乎所有的.net数据绑定控件进行分页,全部无刷新,数据绑定部分可以使用存储过程也可以直接使用sql语句,这对本控件没有任何干扰!本控件具有较好的用户界面,能够根据需要变换各种样式,配合css控制效果则更好! 1.分页样式效果图: 2.如何使用: 于bin目录下添加:AspNetAjaxPager.dll引用 aspx文件内容: 复制代码 代码如下: <%@ Page Language="C#"

  • ASP.NET数据绑定之DataList控件实战篇

    上篇文章大概讲了DataList的一些基础知识,掌握这些知识在将来的应用中起到很大的作用,现在我们就开始讲上篇文章中说的基础知识做一个小例子.     首先,我机子的数据库中有一张person表,如下图所示. 现在,我们用DataList控件将表中的信息显示出来,并可以在DataList控件上对数据库中的表进行编辑操作.     1.首先用vs创建web应用程序,添加web窗体,在web窗体内拉入DataList控件,右击控件,选择编辑项模板,在这里我们能看到四个模板,其中两个是Selected

  • ASP.NET数据绑定之DataList控件

    DataList控件是.NET中的一个控件.DataList控件以表的形式呈现数据(在属性生成器中可以编辑),通过该控件,您可以使用不同的布局来显示数据记录(使用模板编辑),例如,将数据记录排成列或行的形式.您可以对 DataList控件进行配置,使用户能够编辑或删除表中的记录(使用EditItemTemplate模板和SelectedItemTemplate模板).DataList控件不使用数据源控件的数据修改功能,您必须自己提供此代码. 一.DataList 与 Repeater比较    

  • 浅谈ASP.NET常用数据绑定控件优劣总结

    本文的初衷在于对Asp.net常用数据绑定控件进行一个概览性的总结,主要分析各种数据绑定控件各自的优缺点,以便在实际的开发中选用合适的控件进行数据绑定,以提高开发效率. 因为这些数据绑定控件大部分都已经封装的很好了,稍微有一些基础的朋友都可以很容易的上手使用,所以本文不涉及具体控件的使用,只在于分析各自的优劣点,但是在下一篇文章里,我会主要讲一下ListBox.GridView.Repeater这三个数据绑定控件的"高效分页",ListBox和GridView内置的有分页,但是其效率太

  • 总结Visual Studio下ASP.NET模板化控件中的数据绑定

    在模板化控件中绑定到数据 FormView.DataList.Repeater 和 ListView Web 服务器控件使用模板显示数据和检索用户输入,以插入.更新或删除数据.此外,您还可以将模板与 GridView 和 DetailsView 控件一同使用,以自定义数据布局. 通过将模板化控件的 DataSourceID 属性设置为数据源控件的 ID,可以将模板化控件绑定到数据源控件(例如 LinqDataSource.ObjectDataSource 或 SqlDataSource 控件).

  • ASP.NET数据绑定之Repeater控件

    在ASP.NET的学习过程中,其控件的学习和使用占了很大的一部分,本文为大家介绍一下控件Repeater控件的使用,用它来绑定后台数据,然后在客户端(浏览器)上显示出来! 一. Repeater控件 1.用途:使用模板循环显示数据. 2.包含的模板: <ItemTemplate></ItemTemplate> 项目模板(里面的数据正常显示) <AlternatingItemTemplate></AlternatingItemTemplate> 交错显示模板(

  • ASP.NET数据绑定控件详解

    ListBox.GridView.Repeater这三个数据绑定控件的"高效分页",ListBox和GridView内置的有分页,但是其效率太低了,少量的数据还可以,大量的数据根本就没法用,Repeater控件本身不提供分页,但是在实际的开发中可能也会有用到分页,所以也会给大家讲一下,Repeater的分页. 好了,现在开始进入正题,先从比较常用的控件说起. 一.GridView控件 主要特点:支持删.改,排序.分页.外观设置.自定义显示数据 缺 点:影响程序性能.不支持插入操作 这个

  • ASP.NET数据绑定之GridView控件

    GridView 是 DataGrid的后继控件,在.net framework 2 中,虽然还存在DataGrid,但是GridView已经走上了历史的前台,取代DataGrid的趋势已是势不挡.  作用:其功能是在web页面中显示数据源中的数据.GridView和DataGrid功能相似,都是在web页面中显示数据源中的数据,将数据源中的一行数据,也就是一条记录,显示为在web页面上输出表格中的一行.     在此GirdView的详细属性和事件我不再阐述.下面我只是简单介绍一下GirdVi

  • 详解ASP.NET数据绑定操作中Repeater控件的用法

    一.绑定控件之Repeater .NET封装了多种数据绑定控件,诸如GridView.DataList等但该篇文章将会从Repeater入手,因为Repeater只提供了基本的数据绑定模板,没有内置其它分页等功能,所以它是最原始的数据绑定控件,只要能够熟练运用Repeater控件其它的绑定控件也就很简单了. 1.Repeater简介 Repeater 控件是基本模板化数据列表. 它不像GridView控件一样能够可视化的设计格式或样式,因此开发时在控件模板中必须显式声明所有格式.格式和样式标记.

  • asp.net中使用 Repeater控件拖拽实现排序并同步数据库字段排序

    数据库表中有一个单位表,里面包括ID.Name.Order等字段,现在有个后台管理功能,可以设置这些单位在某些统计表格中的先后显示顺序,于是想到用拖拽方式实现,这样操作起来更简便. 使用了GifCam软件做了一个示例动画,效果如下图所示: 于是就动手起来,发现jquery.ui中提供sortable函数,可用于排序,界面中从数据库绑定的单位使用Repeater控件,下面简单介绍下主要步骤: 1.项目中使用到的jquery-1.7.2.min.js和jquery-ui.min.js请点击进行下载,

  • 详解支持Angular 2的表格控件

    前端框架一直这最近几年特别火的一个话题,尤其是Angular 2拥有众多的粉丝.在2016年9月份Angular 2正式发布之后,大量的粉丝的开始投入到了Angular 2的怀抱.当然这其中也包括我.如果你想了解Angular 2,推荐官方网站:英文版.中文版.通过快速起步,可以快速体验Angular 2. 公司的一个项目想基于Angular 2的2.4 版本进行开发,目前还在进行前期的调研阶段.我担当的任务就是研究基于Angular 2的UI控件,在官方网站的资源中列出了很多支持Angular

  • 详解Vue.js和layui日期控件冲突问题解决办法

    事故还原: 今天在用layui的日期控件的时候发现一个问题,就是form表单中的日期选择之后,如果后面的输入框再输入值,这个日期就会自动清空,导致没办法提交,研究之后发现是vue的model绑定和layui冲突产生的,事实上是vue无法动态绑定layui中获取到的日期值,我们把那个v-model去掉就好,但是去掉的话就没办法动态绑定后台数据. 下面是html+vuejs+layui lyui通过use方法获取到input的ID实现日期选择,但是vue的model绑定和layui是有冲突的. 对于

  • 详解ASP.NET-----Repeater数据控件的用法总结

    一.Repeater控件的用法流程及实例: 1.首先建立一个网站,新建一个网页index.aspx. 2.添加或者建立APP_Data数据文件,然后将用到的数据库文件放到APP_Data文件夹中. 3.打开数据库企业管理器,数据库服务器为local(.),然后将APP_Data文件夹中的数据库附加到数据库服务器中. 4.添加Ling to  SQL类. 5.打开视图,服务器资源管理器,右击数据库服务器,选择添加连接,然后选择数据库服务器.数据库类型,及数据库表,然后完成. 6.将需要用到的表,全

  • Repeater控件动态变更列(Header,Item和Foot)信息实现思路

    需求开发一个小报表,显示最近五个月的summary的数量统计,报表会随月份的变化而变化,如下图.第一列[Department]固定,第二至第六列,也就是说Nov 2012 这列会在下月的时候消失,其后的列会向前移,最后一列Mar 2013 会变为Apr 2013. 下图中,最底一行是显示每一列的总数(除第一列外). 为了这个报表,Insus.NET决定使用Repeater控件来实现.难度在于动态显法第二列至第六列的列名,以及绑定数据.最后一行计算总计的,只要完成上面的动态绑定之后,也算不上问题,

随机推荐