allora il codice della sub che mi crea problemi è il seguente:
codice:
 Private Sub PrintDocument3_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument3.PrintPage
        'DICHIARAZIONI GENERALI
        Dim Font1 As New Font("Times New Roman", 28, FontStyle.Bold)                                        'Creo i font necessari
        Dim Font2 As New Font("Times New Roman", 14, FontStyle.Bold)
        Dim Font3 As New Font("Times New Roman", 12)
        Dim Font4 As New Font("Times New Roman", 12)
        Dim Font5 As New Font("Times New Roman", 18, FontStyle.Bold)
        ' Static i As Integer             
        Dim Y As Integer = 340          '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 a, b, bb As String
        Dim c, d, m, v, z, p, q, cc As Date
        Dim dtOggi As Date
        Dim f, n, l, ll, qq, qqq As String
        Dim g, h, i, ii As Integer
        Static progress As Integer
        Static num_pagina As Integer = 0
        Static index_count_progrss As Integer
        Dim conteggio As Integer = 0



        num_pagina = num_pagina + 1


        progress = DataGridView2.Rows.Count - 2
        e.Graphics.DrawString("Elenco certificati ", Font5, Brushes.Black, 170, 180)
        If MaskedTextBox1.Text <> "00/00/0000" And TextBox5.Text = "" Then

            e.Graphics.DrawString("Data delibera: " & MaskedTextBox1.Text, Font3, Brushes.Black, 7, 240)
            e.Graphics.DrawString(TextBox1.Text, Font3, Brushes.Black, 692, 240)
        ElseIf MaskedTextBox1.Text = "00/00/0000" And TextBox5.Text <> "" Then
            e.Graphics.DrawString("Anno: " & TextBox5.Text, Font3, Brushes.Black, 7, 240)
            e.Graphics.DrawString(TextBox5.Text, Font3, Brushes.Black, 692, 240)

        Else
        End If

        e.Graphics.DrawLine(Pens.Black, 7, 260, 500, 260)
        e.Graphics.DrawString("N°", Font3, Brushes.Black, 7, 280)
        e.Graphics.DrawString("Cognome", Font3, Brushes.Black, 42, 280)
        e.Graphics.DrawString("Nome", Font3, Brushes.Black, 242, 280)
        e.Graphics.DrawString("Luogo di nascita", Font3, Brushes.Black, 442, 280)
        e.Graphics.DrawString("Data di nascita", Font3, Brushes.Black, 672, 280)


        If index_count_progrss <= progress Then

            While conteggio < 39
                If index_count_progrss = 0 Then
                    e.Graphics.DrawString(index_count_progrss, Font3, Brushes.Black, 7, 350)
                    e.Graphics.DrawString(DataGridView2.Rows(index_count_progrss).Cells(1).Value, Font3, Brushes.Black, 42, 350)
                    e.Graphics.DrawString(DataGridView2.Rows(index_count_progrss).Cells(2).Value, Font3, Brushes.Black, 242, 350)
                    e.Graphics.DrawString(DataGridView2.Rows(index_count_progrss).Cells(3).Value, Font3, Brushes.Black, 442, 350)
                    e.Graphics.DrawString(DataGridView2.Rows(index_count_progrss).Cells(4).Value, Font3, Brushes.Black, 692, 350)
                    conteggio = conteggio + 1
                    index_count_progrss = index_count_progrss + 1

                Else
                    If index_count_progrss <= progress Then
                        e.Graphics.DrawString(index_count_progrss, Font3, Brushes.Black, 7, 350 + (20 * conteggio))
                        e.Graphics.DrawString(DataGridView2.Rows(index_count_progrss).Cells(1).Value, Font3, Brushes.Black, 42, 350 + (20 * conteggio))
                        e.Graphics.DrawString(DataGridView2.Rows(index_count_progrss).Cells(2).Value, Font3, Brushes.Black, 242, 350 + (20 * conteggio))
                        e.Graphics.DrawString(DataGridView2.Rows(index_count_progrss).Cells(3).Value, Font3, Brushes.Black, 442, 350 + (20 * conteggio))
                        e.Graphics.DrawString(DataGridView2.Rows(index_count_progrss).Cells(4).Value, Font3, Brushes.Black, 692, 350 + (20 * conteggio))
                        conteggio = conteggio + 1
                        index_count_progrss = index_count_progrss + 1
                    Else
                        conteggio = conteggio + 1
                    End If


                End If
            End While

        End If

        If index_count_progrss <= progress Then
            conteggio = 0
            e.HasMorePages = True

        End If








    End Sub
praticamente questa sub stampa un elenco presente in un datagridview suddividendolo su più pagine con il metodo hasmorepage.
Ho letto in giro che Hasmorepage non fa altro che richiamare la funzione ricorsivamente, quindi, si richiede l'utilizzo di variabili statiche per non perdere i dati utilizzati nel ciclo precedente di stampa. La variabile index_count_progrss non è altro che un puntatore all'ultimo record(riga del Datagridview) stampato nella pagina precedente e mantiene il suo vecchio valore tra una chiamata e l'altra.
Bene questo è anche il mio problema, perchè se devo stampare su più pagine funziona tutto ok, se richiamo,invece, la funzione 2 volte la stampa rientra su una sola pagina, la variabile index_count_progrss arriva alla fine del Datagridview e non riesco a riportarla all'inizio nella seconda chiamata.

al momento ho risolto replicando la routine di stampa e facendo un controllo preventivo sul numero di dati da stampare, se supera il limite chiamo la versione con il paginato(static) altrimenti una versione che non fa il paginato. Non penso pero sia un'alternativa tanto corretta.