核心思路

无论使用哪种技术,基本流程都遵循以下步骤:

c net网页如何打印控件
(图片来源网络,侵删)
  1. 准备打印样式:创建一个专门用于打印的 CSS 样式表(或使用 @media print)。
  2. 控制显示/隐藏:在打印样式中,设置 display: none; 来隐藏不需要打印的元素(如 .no-print 类)。
  3. 触发打印:通过 JavaScript 的 window.print() 方法调用浏览器的打印对话框。

使用 CSS 的 @media print(最推荐、最常用)

这是最标准、最优雅的解决方案,因为它将样式与行为分离,且无需引入额外的库。

实现步骤:

在你的 CSS 文件中(或 <style> 标签内),添加 @media print 块。

/* 正常显示时的样式 */
body {
    font-family: Arial, sans-serif;
    background-color: #f0f0f0;
}
/* 导航栏、按钮等不需要打印的元素 */
.navbar, .action-buttons, .footer {
    /* 正常显示时它们是可见的 */
}
/* 
  打印媒体查询:当用户按下 Ctrl+P 或点击打印按钮时,
  浏览器会应用这里的样式。
*/
@media print {
    /* 1. 隐藏所有不希望打印的元素 */
    .no-print {
        display: none !important; /* !important 确保覆盖其他可能的样式 */
    }
    /* 2. 可选:优化打印页面的样式 */
    body {
        background-color: white; /* 去掉背景色,节省墨水 */
        font-size: 12pt; /* 稍微增大字体,方便阅读 */
    }
    /* 3. 可选:防止内容被分页符打断 */
    .print-container {
        page-break-inside: avoid;
    }
    /* 4. 可选:添加页眉或页脚 */
    @page {
        margin: 2cm; /* 设置页面边距 */
    }
}

在你的 HTML/ASPX 页面中,给需要隐藏的控件添加 no-print 类。

假设你的页面布局如下:

c net网页如何打印控件
(图片来源网络,侵删)
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">打印控件示例</title>
    <link href="Styles/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
        <!-- 不需要打印的导航栏 -->
        <div class="navbar no-print">
            <a href="#">首页</a> | <a href="#">lt;/a> | <a href="#">联系</a>
        </div>
        <!-- 主要内容区域,这是我们想要打印的控件 -->
        <div class="print-container">
            <h1>销售报告</h1>
            <p>报告生成时间:<asp:Label ID="lblDate" runat="server" Text="2025-10-27"></asp:Label></p>
            <asp:GridView ID="gvSalesReport" runat="server" AutoGenerateColumns="false" CssClass="print-container">
                <Columns>
                    <asp:BoundField DataField="ProductName" HeaderText="产品名称" />
                    <asp:BoundField DataField="Quantity" HeaderText="数量" />
                    <asp:BoundField DataField="Price" HeaderText="单价" />
                </Columns>
            </asp:GridView>
        </div>
        <!-- 不需要打印的按钮 -->
        <div class="action-buttons no-print">
            <asp:Button ID="btnPrint" runat="server" Text="打印此报告" OnClientClick="window.print(); return false;" />
            <asp:Button ID="btnBack" runat="server" Text="返回" />
        </div>
    </form>
</body>
</html>

添加打印按钮(可选,但用户友好)。

在上面的 HTML 中,我已经添加了一个打印按钮,它的 OnClientClick 事件直接调用了 window.print()return false; 用于防止页面回发。

优点:

  • 纯前端解决方案,不涉及服务器端逻辑,简单高效。
  • 符合 Web 标准,是处理打印样式的推荐方式。
  • 可维护性高,样式和 HTML 结构分离。

使用 JavaScript 动态创建打印窗口

这种方法适用于更复杂的场景,比如你希望打印的内容是动态生成的,或者不希望打印样式污染你的主页面样式。

c net网页如何打印控件
(图片来源网络,侵删)

实现步骤:

创建一个隐藏的打印模板。

这个模板可以是一个 HTML 字符串,包含你想要打印的所有内容,并且已经应用了打印友好的样式。

<!-- 在你的页面中放置一个隐藏的 div 作为模板 -->
<div id="printTemplate" style="display: none;">
    <h1>销售报告 (打印版)</h1>
    <p>报告生成时间:<span id="printDate"></span></p>
    <table border="1">
        <thead>
            <tr>
                <th>产品名称</th>
                <th>数量</th>
                <th>单价</th>
            </tr>
        </thead>
        <tbody id="printTableBody">
            <!-- 数据将通过 JavaScript 填充 -->
        </tbody>
    </table>
</div>

编写 JavaScript 函数来填充数据并触发打印。

function PrintReport() {
    // 1. 获取原始数据和日期
    var reportDate = document.getElementById('<%= lblDate.ClientID %>').innerText;
    var gridView = document.getElementById('<%= gvSalesReport.ClientID %>');
    // 2. 填充打印模板
    document.getElementById('printDate').innerText = reportDate;
    // 3. 克隆 GridView 的表体内容到打印模板中
    // 注意:这只是一个简单示例,实际中可能需要更复杂的逻辑来处理表头、分页等
    var printTableBody = document.getElementById('printTableBody');
    printTableBody.innerHTML = ''; // 清空
    // 假设 gvSalesReport 的 tbody 有 id "gvSalesReporttbody"
    var originalTableBody = document.getElementById('gvSalesReporttbody');
    if (originalTableBody) {
        printTableBody.innerHTML = originalTableBody.innerHTML;
    }
    // 4. 打开一个新窗口,写入模板内容,并调用打印
    var printWindow = window.open('', '_blank');
    printWindow.document.write('<!DOCTYPE html><html><head><title>打印报告</title>');
    printWindow.document.write('<style>');
    printWindow.document.write('body { font-family: Arial, sans-serif; }');
    printWindow.document.write('table { width: 100%; border-collapse: collapse; }');
    printWindow.document.write('th, td { border: 1px solid #ccc; padding: 8px; text-align: left; }');
    printWindow.document.write('</style>');
    printWindow.document.write('</head><body>');
    printWindow.document.write(document.getElementById('printTemplate').innerHTML);
    printWindow.document.write('</body></html>');
    printWindow.document.close(); // 关闭文档流,确保内容完全加载
    // 5. 等待新窗口内容加载完成后打印
    printWindow.onload = function () {
        printWindow.print();
        printWindow.close(); // 打印后关闭窗口
    };
}
// 在按钮的 OnClientClick 中调用此函数
// <asp:Button ... OnClientClick="PrintReport(); return false;" />

优点:

  • 完全隔离和主页面样式完全分离,不会互相影响。
  • 灵活性高:可以对打印内容进行任意处理和格式化。

缺点:

  • 实现复杂:需要手动处理数据复制和 DOM 操作。
  • 用户体验稍差:会弹出一个新窗口,然后自动关闭。

使用 ASP.NET 服务器端生成 PDF(企业级方案)

如果你的最终目标是生成一个“打印友好”的文档(如 PDF),而不是直接调用浏览器打印,那么服务器端生成 PDF 是最佳选择。

实现步骤:

选择一个 PDF 生成库。

  • iTextSharp (免费,功能强大,但 API 较老)
  • PdfSharp (免费,.NET 原生)
  • Syncfusion Essential PDF (商业,功能非常强大)
  • Spire.PDF (商业)

在服务器端代码(如 aspx.cs)中生成 PDF。

// 在按钮的 Click 事件中
protected void btnGeneratePdf_Click(object sender, EventArgs e)
{
    // 1. 创建 PDF 文档
    Document doc = new Document();
    PdfWriter.GetInstance(doc, new FileStream(Server.MapPath("~/Reports/SalesReport.pdf"), FileMode.Create));
    doc.Open();
    // 2. 添加内容(可以基于你的控件数据)
    Paragraph title = new Paragraph("销售报告", FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 18));Alignment = Element.ALIGN_CENTER;
    doc.Add(title);
    doc.Add(new Paragraph(Environment.NewLine)); // 换行
    Paragraph date = new Paragraph("报告生成时间: " + lblDate.Text);
    doc.Add(date);
    doc.Add(new Paragraph(Environment.NewLine));
    // 3. 将 GridView 的数据转换为 PDF 表格
    PdfPTable pdfTable = new PdfPTable(gvSalesReport.Columns.Count);
    pdfTable.WidthPercentage = 100;
    // 添加表头
    foreach (DataControlFieldHeaderCell header in gvSalesReport.HeaderRow.Cells)
    {
        pdfTable.AddCell(new Phrase(header.Text));
    }
    // 添加数据行
    foreach (GridViewRow row in gvSalesReport.Rows)
    {
        foreach (TableCell cell in row.Cells)
        {
            pdfTable.AddCell(new Phrase(cell.Text));
        }
    }
    doc.Add(pdfTable);
    doc.Close();
    // 4. 提示用户下载
    Response.ClearContent();
    Response.ClearHeaders();
    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "attachment; filename=SalesReport.pdf");
    Response.WriteFile(Server.MapPath("~/Reports/SalesReport.pdf"));
    Response.Flush();
    Response.End();
}

优点:

  • 专业输出:生成格式固定、专业的 PDF 文件。
  • 用户体验好:用户可以直接下载保存,打印效果由 PDF 阅读器保证。
  • 跨平台:生成的 PDF 文件可以在任何设备上打开和打印。

缺点:

  • 服务器资源消耗:在服务器端生成 PDF 会占用 CPU 和内存。
  • 需要额外库:需要引入第三方组件(有些是收费的)。
  • 不适用于实时预览:无法像方法一那样在打印前让用户预览。

总结与推荐

方法 优点 缺点 适用场景
@media print 简单、标准、纯前端 样式可能需要精细调整 绝大多数场景,特别是需要快速实现、用户通过浏览器直接打印的情况。(首选推荐)
JS 动态窗口 完全隔离、灵活性高 实现复杂,用户体验稍差 与主页面差异巨大,或需要完全不同的样式,且不介意弹出窗口。
服务器端 PDF 输出专业、格式固定、用户体验好 消耗服务器资源、需引入库 企业级应用,需要生成正式文档、存档或保证打印效果绝对一致的场景。

对于你的问题 “c# net网页如何打印控件”,如果你指的是让用户通过浏览器打印出某个控件的视觉内容,方法一(@media print)是毫无疑问的最佳选择,它简单、高效,并且是处理网页打印问题的行业标准做法。