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

(图片来源网络,侵删)
- 准备打印样式:创建一个专门用于打印的 CSS 样式表(或使用
@media print)。 - 控制显示/隐藏:在打印样式中,设置
display: none;来隐藏不需要打印的元素(如.no-print类)。 - 触发打印:通过 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 类。
假设你的页面布局如下:

(图片来源网络,侵删)
<!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 动态创建打印窗口
这种方法适用于更复杂的场景,比如你希望打印的内容是动态生成的,或者不希望打印样式污染你的主页面样式。

(图片来源网络,侵删)
实现步骤:
创建一个隐藏的打印模板。
这个模板可以是一个 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)是毫无疑问的最佳选择,它简单、高效,并且是处理网页打印问题的行业标准做法。
