【问题标题】:How to print collection of ID cards in one print like Microsoft Office Publisher?如何像 Microsoft Office Publisher 一样在一次打印中打印身份证集合?
【发布时间】:2017-10-31 07:33:08
【问题描述】:

在我的应用程序中,我有一个用于创建员工身份证的表格。一切都很好,但是通过将所有选定的身份证添加到页面来打印它时我遇到了问题。就像在 1 页中打印大约 4 张横向卡片非常容易,这可以使用打印文档方法以及 rdlc 报告来完成。我使用 printdocument 的 PrintPage 事件来完成这项工作和 rdlc 报告的参数。但两者都限制为每次打印 4 张卡片。但我想要的是假设有 20 名新员工/员工需要身份证,我想一次性打印出来。

我尝试了什么?

打印文档方法

将所有 ID 卡添加到 DataGridView,然后在 PrintDocument 的 PrintPage 事件中使用此代码

Dim i as integer = 25
For j as Integer = 0 To dgv.rowcount - 1
   e.Graphics.DrawImage(dgv.rows(j).Cells(0).Value, 25, i, 375, 236)
   i += 241
Next
i = 25

但是每次打印最多只能打印 4 张卡片。我尝试使用e.HasMorePages = True,但无法获得我想要的东西。

RDLC 报告方法

创建一个 DataSet DS1,并添加一个列名与我的 datagridview 列名相同的表,然后使用 DataSet DS1 创建一个 rdlc 报告,并在其中添加一个表,其中只有图像列可见。

但不幸的是,这是本例中最大的失败,因为它甚至无法显示单张图片。所以我可以选择在报表上创建图片并使用 Parameter 方法从表单中获取值,这再次限制了我每次打印超过 4 张卡片。

【问题讨论】:

  • PrintPage 事件处理程序的重点是打印页面。如果您只能在页面上放置四张卡片,那么您只需在事件处理程序中绘制四张卡片。你需要记录你已经抽了多少张牌,每次都从下一张开始。 HasMorePages 设置为 True 仅当有更多要打印时。
  • 是的,伙计,你是对的!这就是我想做但做不到的事情。一点编码建议可能会有很大帮助... :)

标签: vb.net datagridview report printdocument


【解决方案1】:

这是一个在多个页面上打印项目列表的示例。在本例中,每页执行四次。

Const ITEMS_PER_PAGE As Integer = 4

Private items As List(Of Object)
Private itemIndex As Integer

Private Sub PrintDocument1_BeginPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.BeginPrint
    'Start from the beginning of the list.
    itemIndex = 0
End Sub

Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    For i = 1 To ITEMS_PER_PAGE
        If itemIndex = items.Count Then
            'We're done.
            Exit For
        End If

        Dim item = items(itemIndex)

        'Print item here.

        itemIndex += 1
    Next

    'Print another page if and only if we are not at the end of the list.
    e.HasMorePages = itemIndex < items.Count
End Sub

请注意,itemIndex 在调用 PrintPage 事件处理程序之间保持其值。

【讨论】:

  • 正如我所说,这只是打印列表的示例。您可以用任何列表替换 List(Of Object),例如String 数组,Rows DataGridView 的集合或其他。它只是举例说明您可以分页访问列表中的项目以便一次打印一页。列表是什么,该列表中的项目是什么以及您实际绘制这些项目的方式会因每个特定情况而异,但代码的模式将保持不变。
  • A PrintDocument 没有页面。它管理打印,包括将需要打印的内容发送到打印机(至少在高级别),但它实际上不包含任何意义上的打印页面。
  • 请注意,PrintPage 事件处理程序使用Graphics 对象进行绘图。它从e.Graphics 属性中获取该对象。您可以做的是将绘图代码移动到一个以Graphics 对象作为参数的方法中,然后从具有不同对象的多个位置调用它,例如从PrintPage 事件处理程序和其他地方调用Graphics.FromImage 的结果。然后,您可以用一个电话打印并用另一个电话在Bitmap 上绘图。
  • 请参阅here 了解我所说的示例。它使用Paint 事件而不是PrintPage 事件,但它按照我上面所说的那样做,并将绘图代码移动到它自己的方法,然后从两个不同的地方调用它,使用两个不同的Graphics 对象,其中一个是来自Image
  • 您可能还认为您可以从Bitmap 开始绘制,然后调用DrawImage 进行打印。这样,为正在打印的内容创建 Image 就是打印过程本身的一部分。
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 2020-04-17
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
相关资源
最近更新 更多