0

私の状況は次のとおりです。まず、すべての印刷コードがモジュールに格納されており、印刷ボタンをクリックすると呼び出されます。私の問題は、ドキュメントを初めて印刷するときにページが正常に印刷されることですが、もう一度 [印刷] をクリックすると、ページが重ねて印刷され始めます。デバッグすると、e.hasmorepages は false に設定されますが、ループして print_page イベントを数回実行します... hasmorepages が間違いなく false に設定されているにもかかわらず、なぜ何度もループするのか混乱しています?? 通常、最初は正しく印刷されますが、2 回目に印刷をクリックすると印刷されないという事実は、何かを処分する必要があると考えさせます。各印刷の前にページ番号変数が1に設定されていることはわかっているので、そうではありません。私が使用しているコードは、独自のモジュールに移動するまで機能していました。

注: [印刷] をクリックすると、配信レシートが必要かどうかを選択します。いいえの場合、ストア コピーとカスタマー コピーが印刷されます。はいの場合、店舗、顧客、および配送のコピーが印刷されます。通常、店舗コピーと顧客コピーは重ねて印刷されますが、配送コピーは正しいため、3 ページではなく 2 ページが印刷されます。

私のモジュールの基本的な概要は次のとおりです。

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

これを見てくれてありがとう!私は問題を追跡するのに何時間も費やしましたが、運がありませんでした。

4

1 に答える 1

0
 Private Doc As New PrintDocument()

これが問題の始まりです。

    AddHandler Doc.PrintPage, AddressOf Print_PrintPage

これはあなたが自分自身を釘付けにした場所です。As New構文は非常に便利ですが、オブジェクトを作成するのは 1 回だけです。問題は、printInvoice への最初の呼び出しだけが PrintDocument オブジェクトを作成することです。ただし、printInvoice() を呼び出すたびに、別のPrintPage イベント ハンドラーを同じオブジェクトに追加します。つまり、2 回目の印刷では、PrintPage イベント ハンドラーがページごとに2 回実行されます。3 回目は 3 回実行されます。など。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 変数に同じ問題があることに注意してください。初期化が早すぎて、間違った行数が格納されている可能性があります。後で別の請求書を使用して再度印刷すると、間違いなく間違った行数が得られます。

グローバル変数には注意してください。このような問題を引き起こすコツがあります。

于 2013-05-07T16:48:56.103 に答える