使用 PrintDocument 和 HasMorePages 打印多页

Posted

技术标签:

【中文标题】使用 PrintDocument 和 HasMorePages 打印多页【英文标题】:Printing multiple pages using PrintDocument and HasMorePages 【发布时间】:2017-04-13 20:47:12 【问题描述】:

我正在尝试打印列表框中的项目列表。我有 284 个项目。其中大约四分之一被打印出来,其余的不打印,在底部最后一个条目是中途截断。我在网上阅读了有关使用 e.HasMorePages 跟踪您离开的位置并打印到下一页的信息,但现在什么都没有打印,它只是说它的打印页 1、2、3、4、5 ......等等。什么也没有发生。我必须按 ctrl+c 并关闭程序。如何实现所需的打印输出?

Private Sub Print_Click(sender As Object, e As EventArgs) Handles Print.Click
  Dim PrintDialog1 As New PrintDialog
  Dim result As DialogResult = PrintDialog1.ShowDialog()
  If result = DialogResult.OK Then PrintDocument1.Print()

  ' PrintPreviewDialog1.Document = PrintDocument1
  ' PrintPreviewDialog1.ShowDialog()
End Sub

Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
  '  e.HasMorePages = True
  Dim itemCount As Integer
  Dim startX As Integer = 10
  Dim startY As Integer = 10
  Dim n As Integer
  For x As Integer = 0 To SoftwareLBox.Items.Count - 1
    e.Graphics.DrawString(SoftwareLBox.Items(x).ToString, SoftwareLBox.Font, Brushes.Black, startX, startY)
    startY += SoftwareLBox.ItemHeight
    If n = 150 Then
      e.HasMorePages = True
      n = 0
      startY = 10
    End If
    startY += e.PageBounds.Height
    n += 1
  Next
End Sub

【问题讨论】:

【参考方案1】:

您编写代码的方式告诉我您认为 PrintPage 方法只被调用一次,并且您正在使用该调用来打印所有内容。这不是它的工作方式。

当需要打印新页面时,它会再次调用 PrintPage 方法,因此您的循环变量必须在 PrintPage 范围之外。打印下一页时,您需要知道当前正在打印的行号。

试试这样:

Private printLine As Integer = 0

Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs)
  Dim startX As Integer = e.MarginBounds.Left
  Dim startY As Integer = e.MarginBounds.Top
  Do While printLine < SoftwareLBox.Items.Count
    If startY + SoftwareLBox.ItemHeight > e.MarginBounds.Bottom Then
      e.HasMorePages = True
      Exit Do
    End If
    e.Graphics.DrawString(SoftwareLBox.Items(printLine).ToString, SoftwareLBox.Font, _
                          Brushes.Black, startX, startY)
    startY += SoftwareLBox.ItemHeight
    printLine += 1
  Loop
End Sub

在打印之前将 printLine 变量设置为零,或在 BeginPrint 事件中将其设置为零。

【讨论】:

以上是关于使用 PrintDocument 和 HasMorePages 打印多页的主要内容,如果未能解决你的问题,请参考以下文章

C# PrintDocument 和打印机状态

使用 PrintDocument 打印图像。如何调整图像以适合纸张尺寸

使用 printdocument 打印多页

winform中自带的pageSetupDialog和printDocument控件

winform使用PrintDocument控件打印

如何使用带有可滚动面板的 PrintDocument?