[转]用添加样式的方法为datagrid打印分页(可有页眉页脚)

原文:http://blog.csdn.net/ppp80/article/details/482053

好久没写东西了!很快就要有新的项目了。前一段时间因为硬盘坏了,所有的资料都没有了,极其郁闷!现在又搜集整理了一些,还是写到这里吧。

     使打印分页的方法有很多了,因为当时客户提出的需求比较急,这种方法比较简单,所以就采用了。关于这种方法网上已经有很多资料了,我在这里只是贴出完整的 步骤和关键的代码。(做的时候方法是我提出来的,具体实现是另一个同事做的,呵呵,要是他看见了,可别说我侵权呀!:))

    这种方法主要是在网页中添加样式<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& gt;来文字号</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>&nbsp;</td>");//空格位置插入 “&nbsp;”,否则空白处会没格

   this.litDisplay.Text = strRetHTML;

其中litDisplay是

<asp:Literal id="litDisplay" runat="server" EnableViewState="False"></asp:Literal>

上面示例只是添加了表头,相同方法可添加表尾。

       呵呵,就这样,是不是挺简单呀?

      注意一点,datagrid中不要加style=" POSITION: absolute;"  一加上这个,从第二页开始就没有表格了。(这个实验了很久才发现这个问题!)


 

 

posted on 2012-07-10 22:19  冷月孤峰  阅读(195)  评论(0)    收藏  举报