如何通过自定义打印窗口打印完整的网格视图区域
本文关键字:打印 网格 视图 区域 何通过 自定义 窗口 | 更新日期: 2023-09-27 17:56:19
我正在创建自定义 GridView 数据打印窗口,该窗口旨在打印出网格视图区域。一个按钮将打印出当前窗口的网格视图,另一个按钮将打印出 GridView 中所有记录的网格视图。 按照现在的代码,单击按钮(分别打印当前页和所有记录)时,预览窗口完美地显示 GridView 中的所有记录(23 列,包括 GridView 两侧的两个命令字段)。 但是,无论我调整什么打印机或CSS/格式设置,当作业打印出来时,网格视图都会被切碎(仅显示网格的一半左右)。
我遇到的两个挑战是:1)我无法以纵向或横向打印完整的网格视图,并且 2) 我的 JavaScript 非常弱。 如何调整以下代码,以便在打印网格视图时打印完整网格?
如果需要更多信息,请随时询问。
这是我的 aspx 文件后面的打印按钮代码。
protected void PrintCurrentPage_Click(object sender, EventArgs e)
{
GridView1.PagerSettings.Visible = false;
GridView1.DataBind();
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
GridView1.RenderControl(hw);
string gridHTML = sw.ToString().Replace("'"", "'")
.Replace(System.Environment.NewLine, "");
StringBuilder sb = new StringBuilder();
sb.Append("<script type = 'text/javascript'>");
sb.Append("window.onload = new function(){");
sb.Append("var printWin = window.open('', '', 'left=0");
sb.Append(",top=0,width=3000,height=600,status=0');");
sb.Append("printWin.document.write('"");
sb.Append(gridHTML);
sb.Append("'");");
sb.Append("printWin.document.close();");
sb.Append("printWin.focus();");
sb.Append("printWin.print();");
sb.Append("printWin.close();};");
sb.Append("</script>");
ClientScript.RegisterStartupScript(this.GetType(), "GridPrint", sb.ToString());
GridView1.PagerSettings.Visible = true;
GridView1.DataBind();
}
这是打印所有记录的代码。
protected void PrintAll_Click(object sender, EventArgs e)
{
GridView1.AllowPaging = false;
GridView1.DataBind();
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
GridView1.RenderControl(hw);
string gridHTML = sw.ToString().Replace("'"", "'")
.Replace(System.Environment.NewLine, "");
StringBuilder sb = new StringBuilder();
sb.Append("<script type = 'text/javascript'>");
sb.Append("window.onload = new function(){");
sb.Append("var printWin = window.open('', '', 'left=0");
sb.Append(",top=0,width=3000,height=600,status=0');");
sb.Append("printWin.document.write('"");
sb.Append(gridHTML);
sb.Append("'");");
sb.Append("printWin.document.close();");
sb.Append("printWin.focus();");
sb.Append("printWin.print();");
sb.Append("printWin.close();};");
sb.Append("</script>");
ClientScript.RegisterStartupScript(this.GetType(), "GridPrint", sb.ToString());
GridView1.AllowPaging = true;
GridView1.DataBind();
}
如果网格的宽度那么大,则默认情况下,您可以在同一页中打印所有内容...
但是,这不是坏消息,事实上,有几篇文章可以帮助您在用户打印时以不同的方式选择和显示相同的网格。
我看到的最好的方法是在一列中显示更多信息,将它们分组到与用户相关的其他内容中,然后尝试一下......
这只是一个例子,我不知道你在打印什么,但是,不要将客户的所有字段都放在一行中,而是将它们分组为:
Customer | Sales Responsible | ...
------------------------------------------------------------------
Bruno Alexandre | Techie Joe | ...
My Street not yours, 56 | 43 sales this month | ...
DK-1400 København | 450.000€ per sale (avg) | ...
然后,您可以使用table-print
class
来装饰该表,其中:
<style>
@media screen
{
table-print {display:none;}
}
@media print
{
table-print {display:block;}
}
@media screen,print
{
...
}
</style>
之后,阅读如何处理分页符:
打印大型 HTML 表格时如何处理分页符
甚至还有 打印引擎 帮助用户禁用他们不想打印的内容......
若要将 GridView 的方向更改为 RTL,请执行以下操作:
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
hw.AddStyleAttribute(HtmlTextWriterStyle.Direction, "rtl");