如何通过自定义打印窗口打印完整的网格视图区域?

时间:2013-01-28 22:01:47

标签: c# javascript asp.net css gridview

我正在创建一个自定义GridView数据打印窗口,该窗口旨在打印出gridview区域。一个按钮将打印出当前窗口的网格视图,另一个按钮将打印GridView中的所有记录。正如代码现在所示,当单击按钮时(分别打印当前页面和所有记录),预览窗口将完美显示GridView中的所有记录(23列包括GridView两侧的两个命令字段)。但是,当打印出作业时,无论我调整什么打印机或CSS /格式设置,网格视图都会被切断(仅显示大约一半的网格)。

我遇到的两个挑战是:1)我无法以纵向或横向打印完整的网格视图; 2)我的javascript非常弱。如何调整以下代码,以便在打印gridview时打印FULL网格?

如果需要更多信息,请不要犹豫。

以下是我的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();


}

2 个答案:

答案 0 :(得分:1)

如果网格宽度很大,则默认情况下您可以在同一页面中将其全部打印出来...

但是,这不是坏消息,事实上,有几篇文章可以帮助您在用户打印时以不同的方式选择和显示相同的网格。

我看到的最好的方法是在一个列中显示更多信息,将它们分组到其他内容并与用户相关,然后尝试一下......

这只是一个例子,我不知道你在打印什么,但是,不是将客户的所有字段都放在一行中,而是将它们分组为:

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)  | ...

然后您可以使用class table-print来装饰该表格,其中:

<style>
@media screen
{
  table-print {display:none;}
}
@media print
{
  table-print {display:block;}
}
@media screen,print
{
  ...
}
</style>

之后,阅读如何处理分页符:

  

How to deal with page breaks when printing a large HTML table

甚至还有Printliminator来帮助用户停用他们不想打印的内容......

答案 1 :(得分:0)

要将GridView的方向更改为RTL:

StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
hw.AddStyleAttribute(HtmlTextWriterStyle.Direction, "rtl");