有时,我们打印报表是要打印的数据是好几页的。当然打印时会自动分页打印的,但是这种分页是有很多问题的,比如无法把表格线加上,另外无法把表头自动添加上。
学TdS网m9K页ij28网(http://www.xwangye.com)
那实现一个可打出这种效果的页该如何设计呢?且看下面的分析。
学TdS网m9K页ij28网(http://www.xwangye.com)
大家应该知道css可以控制分页。那我们今天来讲一下如何通过css来分页。
学TdS网m9K页ij28网(http://www.xwangye.com)
假若我们要打一个报表,要求如下:
学TdS网m9K页ij28网(http://www.xwangye.com)
1.带表头
学TdS网m9K页ij28网(http://www.xwangye.com)
2.分页数据格式
学TdS网m9K页ij28网(http://www.xwangye.com)
说明:关于表头,我们要设计到网页中,而不是页眉中。分页我们使用Css的
学TdS网m9K页ij28网(http://www.xwangye.com)
学TdS网m9K页ij28网(http://www.xwangye.com)
样式定义如下
| 以下是代码片段: <style type="text/css" media=print>
.noPrint{display:none} .pageBreak{page-break-before:always} </style> |
学TdS网m9K页ij28网(http://www.xwangye.com)
实现思路就是,我们要用网页做出一个符合条件的网页内容。
学TdS网m9K页ij28网(http://www.xwangye.com)
学TdS网m9K页ij28网(http://www.xwangye.com)
Asp实现代码:
学TdS网m9K页ij28网(http://www.xwangye.com)
| 以下是代码片段: pageSize=20
rs.open sql,conn,1,1
if rs.eof or rs.bof then
else
i=0
recordCount=rs.recordcount
do while not rs.eof
if i mod pageSize=0 then
response.write "<center>表头</center>"
response.write "<table cellspacing=0 cellpadding=2 style='border-collapse:collapse' border=1>"
Response.Write "<th><td>列名1</td><td>列名2</td><td>列名3</td><td>列名4</td></th>"
end if
Response.Write "<tr><td>" & rs(0) & "</td><td>" & rs(1) & "</td><td>" & rs(2) & "</td><td>" & rs(3) & "</td></tr>"
i=i+1
if rs.eof or ( i mod pageSize=0) then
response.write "</table>"
if i<>recordCount then Response.Write "<div class='pageBreak'></div>"
end if
loop
end if
rs.close
set rs=nothing |
学TdS网m9K页ij28网(http://www.xwangye.com)
学TdS网m9K页ij28网(http://www.xwangye.com)
Asp.net实现代码:如果以控件制作的话,我们要使用两个数据控件,一个用来循环页,一个用来循环页中的数据。
学TdS网m9K页ij28网(http://www.xwangye.com)
我们外侧控件使用repeater,内侧控件使用gridview,当然你内侧控件也可以使用repeater。
学TdS网m9K页ij28网(http://www.xwangye.com)
下面是页面代码:
学TdS网m9K页ij28网(http://www.xwangye.com)
| 以下是代码片段: <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate> <center>表头</center> <!--页面数据表-->
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CssClass="normalTbl"
DataKeyNames="ID" Width="98%" align="center" PageSize="20" AllowPaging="true" PagerSettings-Visible="false"> <Columns> <asp:TemplateField HeaderText="序号"> <ItemTemplate> <asp:Label ID="lblOrder" runat="server"></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:BoundField HeaderText="姓名" DataField="Name" > <ItemStyle HorizontalAlign="Center" Width="60px" /> </asp:BoundField> <asp:BoundField HeaderText="性别" DataField="Sex" > <ItemStyle HorizontalAlign="Center" /> </asp:BoundField> <asp:TemplateField HeaderText="出生年月"> <ItemTemplate> <asp:Label ID="Label2" runat="server" Text='<%# Bind("BirthDay", "{0:yyyy-MM}") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns>
</asp:GridView> </ItemTemplate> <SeparatorTemplate><div class="pageBreak"></div></SeparatorTemplate> </asp:Repeater> |
学TdS网m9K页ij28网(http://www.xwangye.com)
后台代码
| 以下是代码片段: private IList<DomainObj> list;
private int pageSize=20;
protected void Page_Load(object sender, EventArgs e)
{
if(!isPostBack)
{
list=GetList(); //取得数据
int pageCount=list.length/pageSize; //算出页数
ArrayList pages = new ArrayList(); //构造页集合
for (int i = 0; i < pageCount + 1; i++)
pages.Add(i.ToString()); Repeater1.DataSource = pages; //绑定到Repeater
Repeater1.DataBind(); }
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{ if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { GridView grid = (GridView)e.Item.FindControl("GridView1"); grid.PageSize = pageSize; grid.DataSource = list; grid.PageIndex = e.Item.ItemIndex; // grid.RowDataBound += new GridViewRowEventHandler(GridView1_RowDataBound); 如果需要,还可设置Gridview的事件。
grid.DataBind(); } } |
学TdS网m9K页ij28网(http://www.xwangye.com)
以上是使用QWPrint打印分页报表的制作技巧。
学TdS网m9K页ij28网(http://www.xwangye.com)
其实这种思路也可以应用在套打票据的时候。比较有时票据项太多(这种情况一般比较少),可能要打到两张票据上,这时你也可以按照上面的思路去制作一个页面来打印。
学TdS网m9K页ij28网(http://www.xwangye.com)

当前 位置: 

