使用分页打印 GridView

分享于 

5分钟阅读

Web开发

  繁體

介绍

这是一个 WebControl,提供了一个简单的方法来准备在浏览器中分页和打印 ASP.NET GridView

使用指导

这里控件继承自常规 GridView,因此不会丢失原始功能。
我们通过重写呈现 GridView 行的方法来实现分页,当我们检测到它应该是当前页的最后一行。 这是通过使用行的方法 SetRenderMethodDelegate 完成的。

void ReportGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
 if (e.Row.RowType == System.Web.UI.WebControls.DataControlRowType.DataRow)
 {
 _currentPageRow++;
 if (_currentPageRow == this._printPageSize)
 {
 _currentPageRow = 0;
 e.Row.SetRenderMethodDelegate(PageBreakRender);
 }
 }
}

现在,每个页面的最后一行将使用我们的PageBreakRender 方法来呈现自己。 因这里,在 PageBreakRender 方法中,我们必须手动呈现行内容,即在下一页中插入分页符并再次打开表。
下面是 PageBreakRender 方法:

protectedvoid PageBreakRender(HtmlTextWriter output, Control container)
{
 HtmlTextWriter cellsWriter = new HtmlTextWriter(new StringWriter());
 foreach (Control c in container.Controls)
 {
 TableCell cell = (TableCell)c;
 cell.RenderControl(cellsWriter);
 }
 output.Write("<tr>");
 output.Write(cellsWriter.InnerWriter.ToString());
 output.Write("</tr></table>");
 output.Write(GetPageFooterHtml());
 //If it is the last row, don't show the next headerif (_currentPrintPage == PrintPageCount && Rows.Count % 
 (_currentPrintPage) == 0)
 return;
 output.Write("<div style="page-break-after:always;"></div>");
 output.Write(GetHeaderHtml());
 _currentPrintPage++;
}

请注意,有一个调用名为 GetHeaderHtml的方法。 这里方法返回 GridView的头,因此可以在新页中再次呈现它。

这就是控制背后的主要思想。 我还增加了在模板中呈现自定义页面页眉和页面页脚的功能。 启用模板的使用非常简单,你应该在互联网上找到很多关于它的资源。 你还可以仔细查看源代码,看看它是如何工作的。

如何使用它

这里控件将与常规 GridView 一样工作,但是要启用分页,我们应该看几个属性:

  • AllowPrintPaging - 启用分页( bool )
  • PrintPageSize - 适用于单个页面的行数( int )

控件标记的打开应类似于以下内容:

<wc:ReportGridViewrunat="server"BorderWidth="1"ID="gvSample"PrintPageSize="23"AllowPrintPaging="true"AutoGenerateColumns="false">

就是这样。添加这两个属性将使 ASP.NET 输出几个 GridView,每个页面一个。

你仍然可以在分页符之前和之后插入每个 GridView 之间的自定义内容。 这可以通过定义 PageHeaderTemplatePageFooterTemplate 来实现。

下面是我们的示例页面中使用的GridView:

<wc:ReportGridViewrunat="server"BorderWidth="1"ID="gvSample"AutoGenerateColumns="false"PrintPageSize="23"AllowPrintPaging="true"Width="600px"><Columns><asp:BoundFieldDataField="Name"HeaderText="Customer Name"/><asp:BoundFieldDataField="PhoneNumber"HeaderText="Customer Phone"ItemStyle-HorizontalAlign="center"/></Columns><PageHeaderTemplate><br/> PAGE HEADER TEMPLATE HERE
 <br/></PageHeaderTemplate><PageFooterTemplate><br/><hr/> Page <%# gvSample.CurrentPrintPage.ToString() %>/
 <%# gvSample.PrintPageCount %></PageFooterTemplate></wc:ReportGridView>

注意,我们还可以在模板中使用以下几个属性:

  • CurrentPrintPage - 返回当前呈现的页面
  • PrintPageCount - 页面的总页数

可以用于在页脚或者页页眉处显示页码,如上面的示例图片所示。

已知问题

使用 Firefox 时,必须显式设置 BorderWith 属性。 否则,将不显示 GridView的边框。

结束语

在本文中,我们看到了如何扩展 GridView 控件以添加自定义呈现逻辑,并提供在浏览器中打印的有用特性。


GRID  Gridview  print  Paging  打印  
相关文章