首页 > 解决方案 > 在 ASP.NET 中打印由分页符分隔的所有页面

问题描述

我有一个带有#resultsDiv 的网页,该网页是根据对美元价值和预期数量的后端查询动态创建的,并在每个部件号的数据之间插入CSS 分页符。#resultsDiv 中可能有很多或只有几页,具体取决于用户设置的过滤器。它的设计使我们的库存团队可以为我们仓库中可能找到该零件的位置的每个零件编号打印一页。

我的问题是,当我单击按钮打印 div 中的页面(下面的代码)时,它只显示第一页(这是我不想打印的唯一页面)。相反,如果我右键单击并打印,则所有页面都可以打印。

我已经阅读了这些 SO 问题并尝试了他们的大多数解决方案,但均无济于事: window.print() 没有打印整个页面

window.print() 只打印屏幕的“可见”部分

ScriptManager.RegisterStartupScript 代码不起作用 - 为什么?

我也尝试了这里建议的一些东西:

高级 CSS 打印 - 使用 CSS 分页符

作为参考,这里是 ScriptManager 的 MSDN 条目:

ScriptManager.RegisterStartupScript 方法

这是点击处理程序:

    protected void btnPrint_OnClick(object sender, EventArgs e)
    {
        if (!(ViewState["PartsToPrint"] is DataTable dt)) return;
        DataView dv = new DataView(dt);
        DataTable dtDistinctPartNumbers = dv.ToTable(true, "partNumber");
        foreach (DataRow row in dtDistinctPartNumbers.Rows)
        {
            //pull out the data as needed from the datatable rows
            string partNumber = row["partnumber"].ToString();
            if (!dbf.IncrementPrintCount(GetSelectedOrganization(), partNumber))
            {
                setStatus(false, "Error saving print count");
            }
        }
        ScriptManager.RegisterStartupScript(resultsDiv, GetType(), resultsDiv.UniqueID, "window.print();", true);
    }

我也试过:

ScriptManager.RegisterStartupScript(this, typeof(Page), "Print", "window.print();", true);

ScriptManager.RegisterStartupScript(resultsDiv, typeof(Page), "Print", "window.print();", true);

以及其他变体,包括 ASP 呈现的面板 (div) 选择器(请参阅下面的 CSS),所以我的想法已经不多了。

这是相关的CSS:

@media print {
    body, html, #wrapper, #resultsDiv, 
#ContentPlaceHolder1_resultsDiv {
        height: 100%;
        width: 100%;
    }
    p.pagebreakhere {
        display: block;
        page-break-before: always;
    }
}

我需要单击事件来允许我打印所有页面,而不仅仅是第一页。可能更简单地说,给我与右键单击和打印完全相同的对话框。我错过了什么?

标签: javascripthtmlcssasp.netprinting

解决方案


好吧,只要您可以执行一些客户端代码(我可以使用此解决方案),这很容易。

在.aspx页面中,修改:

<asp:Button runat="server" ID="btnPrint" OnClick="btnPrint_OnClick" Text="Print for recount"/> 

至:

<asp:Button runat="server" ID="btnPrint" OnClick="btnPrint_OnClick" Text="Print for recount" OnClientClick="javascript:window.print();"/>

弹出“右键单击和打印”对话框,允许用户打印所有页面,并且 OnClick 事件仍然运行以执行打印计数的后端更新。

可能有一个更优雅的解决方案,但我受到时间限制(库存在本周晚些时候),所以我愿意推进这个解决方案。


推荐阅读