Usando il PrintDocument non riesco a stampare su più pagine e sto impazzendo

Il codice che sto usando è il seguente:

codice:
Public codApp_DT As New DataTable
    Public anteprimaStampa As New DataTable
    Public indiceStorico As Integer
    Public indiceCodApp As Integer
    Public Pagina As Integer


Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage        'Questo è il contenuto della pagina che verrà stampato

        Static s_codApp As String
        'Static indiceCodApp As Integer
        'Static indiceStorico As Integer

        Dim TotPreu As Double
        Dim TotAAms As Double
        Dim TotLordo As Double
        Dim TotNetto As Double
        Dim TotMN As Double

        'DICHIARAZIONI GENERALI
        Dim Font1 As New Font("Arial Black", 18)                                        'Creo i font necessari
        Dim Font2 As New Font("Arial", 18, FontStyle.Bold)
        Dim Font3 As New Font("Arial", 12, FontStyle.Bold)
        Dim Font4 As New Font("Arial", 12)
        'Static i As Integer             'Questa variabile contiene la posizione nel dataset

        'Dim Up_Int As Integer = 50      'Intestazione foglio
        Dim Y As Integer = 180          'In questa invece si mette la posizione di stampa della prima riga dei dati. ATTENZIONE Questa variabile NON deve essere statica, altrimenti i dati vengo progressivamente stampati più in basso, fino a uscire dal foglio
        Dim X As Integer = 110
        Dim rigaMax As Integer = 350
        Dim rigaCorrente As Integer = 110
        'Dim str As String               'In questa variabile inserisco il valore della cella del dataset
        'Static Pagina As Integer        'In questa registro il numero di pagina corrente
        'Totale definitivo

        'Spaziature
        Dim tabPreu As Integer = 50
        Dim tabAams As Integer = 140
        Dim tabLordo As Integer = 220
        Dim tabNetto As Integer = 330
        Dim tabMn As Integer = 410
        Dim tabPerRif As Integer = 500



        '****************************************************************************************
        'INTESTAZIONE DEL DOCUMENTO


        'e.Graphics.DrawImage(Image.FromFile(Application.StartupPath & "\Marchio.jpg"), 50, 50, 150, 150)       'Se voglio rappresentare un'immagine. Per esempio il marchio della ditta
        e.Graphics.DrawString("REPORT", Font1, Brushes.Black, 330, 50)      'Se voglio inserire una stringa con un testo
        e.Graphics.DrawLine(Pens.Red, 50, 50 + 35, 750, 50 + 35)                                'Per visualizzare un elemento grafico

        codApp_DT = Me.Tab_prodTableAdapter.GetData() 'carico tutti i dati di Apparati
        Dim nCodApp As Integer = codApp_DT.Rows.Count  'Verifico il numero degli apparati


        'If rigaCorrente < rigaMax Then
        For Me.indiceCodApp = indiceCodApp To nCodApp - 1
            s_codApp = codApp_DT.Rows.Item(indiceCodApp).Item(0) 'memorizzo
            Dim nomeApp As String = codApp_DT.Rows.Item(indiceCodApp).Item(2)

            anteprimaStampa = Me.Tab_storicoTableAdapter.GetData_UltimoCalcolo_codApp(s_codApp)

            Dim nRecord As Integer = anteprimaStampa.Rows.Count

            For rigaCorrente = rigaCorrente To rigaMax
                e.Graphics.DrawString(nomeApp, Font2, Brushes.Black, 50, rigaCorrente)  'Queste sono le varie voci delle intestazioni di colonna
                rigaCorrente = rigaCorrente + 30
                e.Graphics.DrawString("PREU", Font3, Brushes.Black, tabPreu, rigaCorrente)
                e.Graphics.DrawString("AAMS", Font3, Brushes.Black, tabAams, rigaCorrente)
                e.Graphics.DrawString("LORDO", Font3, Brushes.Black, tabLordo, rigaCorrente)
                e.Graphics.DrawString("NETTO", Font3, Brushes.Black, tabNetto, rigaCorrente)
                e.Graphics.DrawString("MN", Font3, Brushes.Black, tabMn, rigaCorrente)
                e.Graphics.DrawString("Periodo Riferimento", Font3, Brushes.Black, tabPerRif, rigaCorrente)
                rigaCorrente = rigaCorrente + 20

                For Me.indiceStorico = indiceStorico To nRecord - 1

                    If rigaCorrente < rigaMax Then
                        Dim s_preu As String = anteprimaStampa.Rows.Item(indiceStorico).Item(9).ToString
                        e.Graphics.DrawString(s_preu, Font4, Brushes.Black, tabPreu, rigaCorrente)
                        Dim s_aams As String = anteprimaStampa.Rows.Item(indiceStorico).Item(11).ToString
                        e.Graphics.DrawString(s_aams, Font4, Brushes.Black, tabAams, rigaCorrente)
                        Dim s_lordo As String = anteprimaStampa.Rows.Item(indiceStorico).Item(12).ToString
                        e.Graphics.DrawString(s_lordo, Font4, Brushes.Black, tabLordo, rigaCorrente)
                        Dim s_netto As String = anteprimaStampa.Rows.Item(indiceStorico).Item(14).ToString
                        e.Graphics.DrawString(s_netto, Font4, Brushes.Black, tabNetto, rigaCorrente)
                        Dim s_mn As String = anteprimaStampa.Rows.Item(indiceStorico).Item(16).ToString
                        e.Graphics.DrawString(s_mn, Font4, Brushes.Black, tabMn, rigaCorrente)
                        Dim s_perRif As String = anteprimaStampa.Rows.Item(indiceStorico).Item(18).ToString
                        e.Graphics.DrawString(s_perRif, Font4, Brushes.Black, tabPerRif, rigaCorrente)
                        rigaCorrente = rigaCorrente + Font4.GetHeight             'Incremento il valore di Y in modo da stampare la riga seguente sotto la precedente

                        TotPreu = TotPreu + s_preu
                        TotAAms = TotAAms + s_aams
                        TotLordo = TotLordo + s_lordo
                        TotNetto = TotNetto + s_netto
                        TotMN = TotMN + s_mn

                        e.HasMorePages = True               'Permetto di stampare la pagina successiva
                        'Else
                        '    e.HasMorePages = False              'Blocco la stampa
                    End If

                Next indiceStorico
                indiceStorico = 0

                If rigaCorrente < rigaMax Then                                                       'Quando i supera il numero di record da stampare (vuol dire che questi sono finiti), allora stampo il totale
                    rigaCorrente = rigaCorrente + 10
                    e.Graphics.DrawLine(Pens.Black, 50, (rigaCorrente), 720, (rigaCorrente))           'Tiro la linea di somma
                    'e.Graphics.DrawString("TOTALE ", Font3, Brushes.Black, 580, (Y + 20))   'La scritta Totale
                    rigaCorrente = rigaCorrente + 10
                    e.Graphics.DrawString(TotPreu, Font3, Brushes.Black, tabPreu, (rigaCorrente))      'E lo stampo
                    e.Graphics.DrawString(TotAAms, Font3, Brushes.Black, tabAams, (rigaCorrente))
                    e.Graphics.DrawString(TotLordo, Font3, Brushes.Black, tabLordo, (rigaCorrente))
                    e.Graphics.DrawString(TotNetto, Font3, Brushes.Black, tabNetto, (rigaCorrente))
                    e.Graphics.DrawString(TotMN, Font3, Brushes.Black, tabMn, (rigaCorrente))
                    e.HasMorePages = True

                End If
                rigaCorrente = rigaCorrente + 50
            Next
            'Else
            '    e.HasMorePages = False

            'End If

        Next

        If Me.indiceCodApp = nCodApp Then

            e.HasMorePages = False              'Blocco la stampa
        End If

        '****************************************************************************************
        'PIE' DI PAGINA DEL DOCUMENTO
        e.Graphics.DrawLine(Pens.Red, 50, 1060, 750, 1060)                                'Per visualizzare un elemento grafico
        Pagina += 1                                                                     'Incremento il numero di pagina
        e.Graphics.DrawString("Pagina " & Pagina, Font2, Brushes.Black, 600, 1080)
        'e.Graphics.DrawString("Valore della pagina " & Parziale, Font2, Brushes.Black, 50, 850)
        'Incrementale += Parziale
        'e.Graphics.DrawString("Subtotale " & Incrementale, Font2, Brushes.Black, 50, 900)
    End Sub
ho usato come limite della pagina il numero di righe, anche se non so se è del tutto corretto dal momento che i caratteri che scrivo hanno dimensione diversa.

Chiedo lumi per aiutarmi a risolvere il mio prob

Grazie in anticipo