You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET(VB.NET)实现打印每页重复模板/页眉的技术问询

ASP.NET(VB.NET) 实现打印每页重复模板/页眉的解决方案

问题说明

作为ASP.NET(VB.NET)初学者,需要实现文档打印时每页显示相同的自定义模板(页眉,即截图中黑色区域):当GridView记录超过10条时自动分页,第二页及后续页面需保留与第一页一致的模板/页眉。

现有代码问题分析

当前代码尝试通过设置GridView.HeaderRow.TableSection和page-break-after样式实现分页,但存在以下不足:

  • 未将自定义模板(黑色区域页眉)纳入每页打印内容
  • 仅依赖GridView自身表头,未处理自定义模板的重复渲染
  • CSS打印规则未配置,无法确保页眉在每页固定显示

解决方案步骤

  1. 添加自定义打印模板HTML:在页面中定义需要重复的页眉模板(黑色区域)
  2. 配置打印专用CSS:使用@page和媒体查询@media print设置页眉固定显示,同时控制分页符
  3. 调整后台代码:确保GridView每10条记录后添加分页符,并将模板与GridView一同渲染到打印内容中
  4. 完善打印JavaScript函数:正确加载模板、GridView和打印样式

完整代码实现

前端页面(.aspx)

<style id="gridStyles" type="text/css">
    /* 普通样式 */
    .print-header {
        background-color: #000;
        color: #fff;
        padding: 10px;
        margin-bottom: 15px;
    }
    .grid-view {
        width: 100%;
        border-collapse: collapse;
    }
    .grid-view th, .grid-view td {
        border: 1px solid #ccc;
        padding: 8px;
    }

    /* 打印专用样式 */
    @media print {
        @page {
            margin-top: 80px; /* 预留页眉位置 */
        }
        .print-header {
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            height: 60px;
            page-break-inside: avoid;
        }
        .grid-row-break {
            page-break-after: always;
        }
        /* 隐藏不必要的页面元素 */
        .non-printable {
            display: none;
        }
    }
</style>

<!-- 自定义打印页眉模板 -->
<div class="print-header non-printable" id="printHeader">
    <!-- 这里放入你的黑色区域模板内容,比如公司logo、标题等 -->
    <h3>自定义打印页眉</h3>
    <p>这是每页都要显示的黑色区域模板</p>
</div>

<!-- 打印按钮 -->
<asp:Button ID="btnPrint" runat="server" Text="打印" OnClick="PrintGridView" CssClass="non-printable" />

<script type="text/javascript">
    function PrintGrid(gridHTML, gridCSS) {
        var printWindow = window.open('', '_blank');
        // 构建打印页面内容,包含页眉模板和GridView
        var printContent = `
            <html>
                <head>
                    <style>${gridCSS}</style>
                </head>
                <body>
                    <div class="print-header">${document.getElementById('printHeader').innerHTML}</div>
                    ${gridHTML}
                </body>
            </html>
        `;
        printWindow.document.write(printContent);
        printWindow.document.close();
        printWindow.print();
        printWindow.close();
    }
</script>

VB.NET后台代码(.aspx.vb)

Protected Sub PrintGridView(ByVal sender As Object, ByVal e As EventArgs)
    Dim dataGrid As New System.Web.UI.WebControls.GridView()
    ' 设置GridView每页显示10条(对应需求的分页阈值)
    dataGrid.PageSize = 10
    ' 绑定数据源
    dataGrid.DataSource = From lst In _lstPrint 
                          Select New With {
                              .Item = lst.Item,
                              .Descricao = lst.TipoComponente,
                              .Certificado = lst.Certificacao,
                              .Corrida = lst.Corrida,
                              .Qtd = lst.Qtd,
                              .UnidMedida = lst.UnidadeMedida
                          }
    dataGrid.DataBind()

    ' 为每10条记录添加分页符(最后一页不需要)
    For Each row As GridViewRow In dataGrid.Rows
        If (row.RowIndex + 1) Mod dataGrid.PageSize = 0 AndAlso row.RowIndex <> dataGrid.Rows.Count - 1 Then
            row.Attributes.Add("class", "grid-row-break")
        End If
    Next

    ' 渲染GridView为HTML
    Using sw As New StringWriter()
        Dim hw As New HtmlTextWriter(sw)
        dataGrid.RenderControl(hw)
        Dim gridHTML As String = sw.ToString().Replace(Environment.NewLine, "")
        Dim gridCSS As String = gridStyles.InnerText.Replace("""", "'").Replace(Environment.NewLine, "")

        ' 注册打印脚本
        Dim script = "window.onload = function() { PrintGrid('" & gridHTML & "', '" & gridCSS & "'); }"
        ClientScript.RegisterStartupScript([GetType](), "GridPrint", script, True)
    End Using
End Sub

' 必须重写此方法以支持GridView的RenderControl
Public Overrides Sub VerifyRenderingInServerForm(control As Control)
    ' 无需实现内容,允许GridView在服务器表单外渲染
End Sub

关键说明

  • 自定义页眉重复显示:通过CSS的position: fixed结合@media print,确保页眉在打印时固定在每页顶部
  • 分页逻辑:通过为每10条记录的行添加grid-row-break类,触发page-break-after: always实现自动分页
  • 渲染完整打印内容:打印时将自定义页眉模板和GridView HTML一同写入新窗口,确保内容完整性

内容的提问来源于stack exchange,提问作者GojoSatoru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:57:09