vb.net打印错误:即使e.hasmorepages=false,打印页面仍会继续循环
我的情况如下:首先,我所有的打印代码都存储在一个模块中,当我点击打印按钮时,这个模块被调用。我的问题是,我的页面在第一次打印文档时打印得很好,但是如果我再次单击“打印”,页面将开始相互重叠打印。当我调试时,e.hasmorepages将设置为false,但它会循环并再次运行print_page事件几次。。。我很困惑为什么它会循环几次,即使hasmorepages肯定设置为false??通常第一次打印正确,但不是第二次单击“打印”时打印正确,这一事实使用户认为需要处理某些内容。我知道我的页码变量在每次打印之前设置为1,所以不是这样。我使用的代码在我将其移动到它自己的模块之前一直在工作 注意:当我单击“打印”时,我会选择是否需要一份递送回执。如果否,则打印商店副本和客户副本。如果是,则打印门店、客户和交货副本。通常,商店和客户的复印件打印在一起,但送货复印件是正确的,因此打印2页而不是3页 以下是我的模块的基本概要:vb.net打印错误:即使e.hasmorepages=false,打印页面仍会继续循环,vb.net,printing,printdocument,Vb.net,Printing,Printdocument,我的情况如下:首先,我所有的打印代码都存储在一个模块中,当我点击打印按钮时,这个模块被调用。我的问题是,我的页面在第一次打印文档时打印得很好,但是如果我再次单击“打印”,页面将开始相互重叠打印。当我调试时,e.hasmorepages将设置为false,但它会循环并再次运行print_page事件几次。。。我很困惑为什么它会循环几次,即使hasmorepages肯定设置为false??通常第一次打印正确,但不是第二次单击“打印”时打印正确,这一事实使用户认为需要处理某些内容。我知道我的页码变量在
Imports System.Drawing
Imports System.Drawing.Printing
Module Receipt2
Public copy As Integer
Dim row As Integer
Dim ItemsRowCount As Integer = Invoice.dgvInvoiceItems.RowCount
Private Doc As New PrintDocument()
Public Sub printInvoice()
Try
copy = 1
AddHandler Doc.PrintPage, AddressOf Print_PrintPage
Doc.Print()
row = 0
Doc.Dispose()
copy = 1
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub Print_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
Try
'RECEIPT ITEMS PRINTED HERE
'print Store/customer copy and sig line
If copy = 1 Then
g.DrawString("Store Copy", New Font("Verdana", 15, FontStyle.Italic), Brushes.DarkRed, 50, 1045)
e.HasMorePages = True
copy = copy + 1
row = 0
Exit Sub
ElseIf copy = 2 Then
g.DrawString("Customer Copy", New Font("Verdana", 15, FontStyle.Italic), Brushes.DarkRed, 50, 1045)
If Invoice.boolDeliveryReceipt = True Then
e.HasMorePages = True
copy = copy + 1
row = 0
Exit Sub
End If
ElseIf copy = 3 Then
g.DrawString("Delivery Copy", New Font("Verdana", 15, FontStyle.Italic), Brushes.DarkRed, 50, 1045)
End If
'e.HasMorePages = False
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
End Module
非常感谢您抽出时间来查看!我花了好几个小时试图找出这个问题,只是运气不好
Private Doc As New PrintDocument()
这就是问题的根源
AddHandler Doc.PrintPage, AddressOf Print_PrintPage
这就是你自责的地方。As New
语法非常方便,但只需创建一次对象。问题是,只有对printInvoice的第一次调用才会创建PrintDocument对象。但每次调用printInvoice()时,都会向同一对象添加另一个PrintPage事件处理程序。最终的效果是,第二次打印时,PrintPage事件处理程序将为每个页面运行两次。第三次将运行三次。等等。Dispose()方法不会执行任何其他操作,PrintDocument不会使用一次性资源。将其设置为Nothing可以解决问题
您只需在每次打印时创建一个新的PrintDocument对象即可解决此问题。所以
Private Doc As PrintDocument
Public Sub printInvoice()
Try
copy = 1
Doc = new PrintDocument()
AddHandler Doc.PrintPage, AddressOf Print_PrintPage
ItemsRowCount = Invoice.dgvInvoiceItems.RowCount
Doc.Print()
'' etc...
通过使“Doc”成为局部变量,进一步改进此代码。或者将代码移动到类中
请注意ItemsRowCount变量如何存在相同的问题。它可能初始化得太早,存储了错误的行计数。如果您稍后使用不同的发票再次打印,那么您肯定会得到错误的行数
小心使用全局变量,它们有造成类似问题的诀窍。Hans,我非常感谢你!你关于创建新打印文档的建议解决了我的问题。不仅如此,我还注意到了下一张发票上的发票号码有误的问题,所以也感谢您的关注。谢谢你花时间帮我澄清,非常感谢!!