Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vb.net打印错误:即使e.hasmorepages=false,打印页面仍会继续循环_Vb.net_Printing_Printdocument - Fatal编程技术网

vb.net打印错误:即使e.hasmorepages=false,打印页面仍会继续循环

vb.net打印错误:即使e.hasmorepages=false,打印页面仍会继续循环,vb.net,printing,printdocument,Vb.net,Printing,Printdocument,我的情况如下:首先,我所有的打印代码都存储在一个模块中,当我点击打印按钮时,这个模块被调用。我的问题是,我的页面在第一次打印文档时打印得很好,但是如果我再次单击“打印”,页面将开始相互重叠打印。当我调试时,e.hasmorepages将设置为false,但它会循环并再次运行print_page事件几次。。。我很困惑为什么它会循环几次,即使hasmorepages肯定设置为false??通常第一次打印正确,但不是第二次单击“打印”时打印正确,这一事实使用户认为需要处理某些内容。我知道我的页码变量在

我的情况如下:首先,我所有的打印代码都存储在一个模块中,当我点击打印按钮时,这个模块被调用。我的问题是,我的页面在第一次打印文档时打印得很好,但是如果我再次单击“打印”,页面将开始相互重叠打印。当我调试时,e.hasmorepages将设置为false,但它会循环并再次运行print_page事件几次。。。我很困惑为什么它会循环几次,即使hasmorepages肯定设置为false??通常第一次打印正确,但不是第二次单击“打印”时打印正确,这一事实使用户认为需要处理某些内容。我知道我的页码变量在每次打印之前设置为1,所以不是这样。我使用的代码在我将其移动到它自己的模块之前一直在工作

注意:当我单击“打印”时,我会选择是否需要一份递送回执。如果否,则打印商店副本和客户副本。如果是,则打印门店、客户和交货副本。通常,商店和客户的复印件打印在一起,但送货复印件是正确的,因此打印2页而不是3页

以下是我的模块的基本概要:

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,我非常感谢你!你关于创建新打印文档的建议解决了我的问题。不仅如此,我还注意到了下一张发票上的发票号码有误的问题,所以也感谢您的关注。谢谢你花时间帮我澄清,非常感谢!!