打印 .NET DataGridView

Posted

技术标签:

【中文标题】打印 .NET DataGridView【英文标题】:Printing a .NET DataGridView 【发布时间】:2010-10-08 08:26:35 【问题描述】:

我对 .NET 和 C# 还很陌生,但我有一个要打印的 DataGridView。这样做的最佳方法是什么?

【问题讨论】:

@Simon 感谢您添加更多标签! :o) 【参考方案1】:

然后添加一个 DataGridView、一个 PrintDocuemnt 和一个 Button:

button click events 
    printDocument1.Print();


printDocument1_PrintPage events 
    Bitmap bm = new Bitmap(this.dataGridView1.Width, this.dataGridView1.Height);
    this.dataGridView1.DrawToBitmap(bm, new Rectangle(0, 0, this.dataGridView1.Width, this.dataGridView1.Height));
    e.Graphics.DrawImage(bm, 0, 0);

这就是你所有的数据打印。

【讨论】:

不确定我缺少什么,但这会产生很多错误。我正在使用 Visual Studio 13 和 C#。 如果您的所有数据都显示在 DataGridView 中,这非常有用,因为它只打印屏幕上可见的内容。如果您的数据不完全适合 DataGridView 的边界,则您不会获得所有数据。尽管如此,如果这就是你所需要的,它仍然非常优雅和简单。 为了克服@DaveN59 指出的问题,我发现我可以手动将 DataGridView 的高度设置为 (((RowCount - 1) * Rows[0].Height) + ColumnHeadersHeight) 并隐藏调用 DrawToBitmap 之前的垂直滚动条。这会打印整个网格,即使它理论上大于包含窗口的大小!当然,您必须在返回之前将高度恢复到之前的值。 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) Bitmap bm = new Bitmap(this.dataGridView1.Width, this.dataGridView1.Height); this.dataGridView1.DrawToBitmap(bm, new Rectangle(0, 0, this.dataGridView1.Width, this.dataGridView1.Height)); e.Graphics.DrawImage(bm, 0, 0); 【参考方案2】:

CodeProject 上有一些项目已经完成了一些打印 DataGridViews 的工作。

【讨论】:

【参考方案3】:

我知道你已经接受了一个答案,但是对于下一个搜索这个问题的人......

我也在 Code Project 上找到了这个很棒的项目,并且刚刚实现了它。这很容易而且很好。 http://www.codeproject.com/KB/grid/GridDrawer.Net.aspx

【讨论】:

【参考方案4】:

在CodeProject:

Another DataGridView Printer by aureolin

上面是另一个出色的DataGridView 打印机,实现起来非常简单。

我意识到我是这个帖子的Johnny Come Lately。我在寻找其他东西时偶然发现了它,但想为其他通过这种方式发生的人(就像我一样)参考这个出色的打印解决方案。

我希望这里有人能从中得到一些用处。

【讨论】:

【参考方案5】:

您可以将 DataGridView 导出到 Excel,然后从 Excel 中打印出来。

您也可以考虑不在 DataGridView 中显示您的数据,而是在 ReportViewer 控件中显示它,该控件可以导出为 PDF 或 Excel。从那里可以打印您的数据。

【讨论】:

@Bliek 感谢您的建议!就像我在另一条评论中提到的那样,我现在想尝试坚持使用此控件...但我会牢记这一点! 毕竟,我最终还是这样做了。我仍然在 DataGridView 中显示我的数据,但如果用户选择打印它,我会使用报表查看器。再次感谢!【参考方案6】:

恐怕没有内置的打印支持。

您可能会求助于使用第三方控件,例如 Infragistics WinGrid,它具有内置的打印支持。

【讨论】:

@Gerrie Schenck 感谢您的链接!我想现在我会继续努力尝试使用当前控件,但我会记住这一点,以防万一我需要它!【参考方案7】:

.NET WinForm 控件(如 datagridview)本身不支持打印。

但是,对于 datagridview,您可以调用“DrawToBitmap”,然后获取该位图并将其传递给打印功能,以便在纸上生成它。

【讨论】:

@GWLlosa 谢谢!这可行,我可以打印我的网格,但它看起来像一个屏幕截图。我希望能够将其格式化为看起来更友好的东西。想法? 如果你想重新格式化它的外观,你要么需要在调用之前重新格式化控件本身,要么在绘图代码中使用行和单元格中的数据实际“构建自己的”datagridview填充它。很快就会变得一团糟。【参考方案8】:

如果您要打印的不仅仅是 DataGridView,那么更通用的方法可能值得追求。我们使用 MigraDoc,然后编写自己的类来读取 DataGridViews 并输出表示表格的 MigraDoc 类。

有很多很棒的打印包可用,但我只有使用 MigraDoc 的经验。

编辑:

作为对 cme​​ts 的回应,这里是我网站的链接,其中显示了我为生成 MigraDoc 表而创建的代码以及使用它来显示 DataGridView (DataGridView to MigraDoc tables) 的示例。

【讨论】:

您好。你能分享一些使用 Migradoc 和 DataGridViews 的代码示例吗? 用链接更新了我的答案。希望这会有所帮助!【参考方案9】:

我喜欢这种方法http://www.codeproject.com/KB/grid/GridDrawer.Net.aspx但是有什么方法可以选择打印机。

我想在进程结束时自动打印。所以计划选择这个作为选项 1,所以我总是可以打印到默认打印机。另一个选项是选择打印机然后打印。所以总共有 2 个 ptint 函数。 请回复。 干杯

【讨论】:

以上是关于打印 .NET DataGridView的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ghostscript.NET 包装器打印 PDF - 空白页

Ghostscript.NET.dll 打印pdf到指定打印机

使用 Ghostscript 和 .NET 将 PDF 打印到灰度打印机

如何使用 C#/.NET 检索打印机图标 [重复]

vb.net 中是不是有任何代码来检查打印机状态

如果在 vb.net 中有多个页面要打印的数据,如何打印 gridview 内容