好久没写东西了!很快就要有新的项目了。前一段时间因为硬盘坏了,所有的资料都没有了,极其郁闷!现在又搜集整理了一些,还是写到这里吧。
使打印分页的方法有很多了,因为当时客户提出的需求比较急,这种方法比较简单,所以就采用了。关于这种方法网上已经有很多资料了,我在这里只是贴出完整的步骤和关键的代码。(做的时候方法是我提出来的,具体实现是另一个同事做的,呵呵,要是他看见了,可别说我侵权呀!:))
这种方法主要是在网页中添加样式<style>...<style>,在用ie打印的时候,会根据样式标识自动分页。所以,你只需要在表格中适当位置插入这个样式就可以了。
1首先看看写好分页样式的html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>收文日期</title>
<style type="text/css">
.pbreak { PAGE-BREAK-AFTER: always }
</style>
</head>
<body>
<table cellspacing="0" cellpadding="3" rules="all" bordercolor="#6B6969" border="1" id="DG_All" style="border-color:#6B6969;font-size:9pt;width:850px;">
<THEAD style='display:table-header-group;'><tr align="Center" valign="Middle" style="font-weight:bold;">
<td style="width:60px;">收文日期</td><td>来文单位</td><td>来文字号</td><td style="width:40px;">类别</td><td style="width:60px;">收文编号</td><td>文件题目</td><td style="width:20px;">份数</td><td style="width:60px;">处室</td><td style="width:60px;">签收人</td><td style="width:30px;"> </td>
</tr></THEAD><tr align="Center" valign="Middle">
<td>2003-02-17</td><td>a</td><td>[2003]3号</td><td>市内局</td><td>[2003]5</td><td>
aaa</td><td>1 </td><td>a室</td><td> </td><td> </td>
</tr><tr align="Center" valign="Middle">
<td>2003-02-17</td><td>b</td><td>[2003]3号</td><td>请示</td><td>[2003]11</td><td>
bbb</td><td>1 </td><td>b处</td><td> </td><td>存查</td>
</tr><tr align="Center" valign="Middle">
<td>2003-02-14</td><td>c</td><td>第2号</td><td>请示</td><td>[2003]20</td><td>
ccc</td><td>1 </td><td>c处</td><td> </td><td> </td>
</tr><tr align="Center" valign="Middle" style="PAGE-BREAK-AFTER:always;">
<td>2003-02-11</td><td>d</td><td>[2003]19号</td><td>市内局</td><td>[2003]3</td><td>
ddd</td><td>1 </td><td>d处</td><td> </td><td> </td>
</tr><tr align="Center" valign="Middle">
<td>2003-02-10</td><td>e</td><td>[2003]19号</td><td>市内局</td><td>[2003]3</td><td>
eee</td><td>1 </td><td>e处</td><td> </td><td> </td>
</tr><tr align="Center" valign="Middle">
<td>2003-02-17</td><td>f</td><td>[2003]3号</td><td>请示</td><td>[2003]11</td><td>
fff</td><td>1 </td><td>f处</td><td> </td><td>存查</td>
</tr><tr align="Center" valign="Middle">
<td>2003-02-17</td><td>g</td><td>[2003]3号</td><td>请示</td><td>[2003]11</td><td>
ggg</td><td>1 </td><td>g处</td><td> </td><td>存查</td>
</tr>
<tfoot style='display:table-footer-group;'><tr align="Center" valign="Middle" style="font-weight:bold;">
<td colspan="10">这里可以写页码</td>
</tr></tfoot>
</table>
</body>
</html>
把这段代码放到ie里浏览,然后点击“打印预览”,就会发现表格在d和e之间自动分页了。而且每页都有表头和表尾。这个就是我们最终想要的效果。
2再看看asp.net中代码
我们是把一个不分页的datagrid先显示到页面,然后点击ie的“打印预览”,会自动分页。所以要把<THEAD>。。。</THEAD>,style="PAGE-BREAK-AFTER:always;">这些样式循环插入到合适的位置(在后台实现)。
<1>强行分页
private void DG_All_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
//强行分页
if( e.Item.ItemIndex > 0 && (e.Item.ItemIndex + 1 ) % 15 == 0)//15行就分页
{
e.Item.Style.Add("PAGE-BREAK-AFTER","always");
}
}
<2>插入表头表尾的标志
...
DG_All.DataBind();//首先绑定datagrid
System.IO.StringWriter tw=new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw=new System.Web.UI.HtmlTextWriter(tw);
DG_All.RenderControl(hw);
DG_All.Visible = false;
String strRetHTML = renderDG().Replace("border-collapse:collapse;","");
strRetHTML = strRetHTML.Insert(strRetHTML.IndexOf("<tr"),"<THEAD style='display:table-header-group;'>");
strRetHTML = strRetHTML.Insert(strRetHTML.IndexOf("</tr>")+5,"</THEAD>");
strRetHTML = System.Text.RegularExpressions.Regex.Replace(strRetHTML,@"<td>[/s]*</td>","<td> </td>");//空格位置插入“ ”,否则空白处会没格
this.litDisplay.Text = strRetHTML;
其中litDisplay是
<asp:Literal id="litDisplay" runat="server" EnableViewState="False"></asp:Literal>
上面示例只是添加了表头,相同方法可添加表尾。
呵呵,就这样,是不是挺简单呀?
注意一点,datagrid中不要加style=" POSITION: absolute;" 一加上这个,从第二页开始就没有表格了。(这个实验了很久才发现这个问题!)