Ciao,
sono riuscito a stampare: ho trovato del codice in rete e l'ho leggermente modificato per adattarlo alla mia situazione. Il problema riguarda la stampa su più pagine nel caso una grid sia troppo grande (e sono certo che la classifica occuperà ogni volta due pagine, quindi è un problema che devo risolvere per forza): in questo caso la stampa della seconda e della terza tabella inizia direttamente nella prima pagina anzichè nella seconda e va quindi a sovrapporsi alla prima. Sono abbastanza certo che il problema riguardi hasMorePages che se ho capito bene richiama l'evento printPage, causando quindi questa confusione.
Il codice è abbastanza lungo, comunque lo posto tutto, sperando che tu mi possa aiutare.
Grazie!
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
PrintDocument1.DefaultPageSettings.Margins.Left = 1
'stampo le due righe con denominazione e data della gara
e.Graphics.DrawString(LabelGara.Text, LabelGara.Font, Brushes.Black, PrintDocument1.DefaultPageSettings.PaperSize.Width / 2 - LabelGara.Width / 2, 35)
e.Graphics.DrawString(LabelData.Text, LabelData.Font, Brushes.Black, PrintDocument1.DefaultPageSettings.PaperSize.Width / 2 - LabelData.Width / 2, 90)
'stampo la stringa "classifica 1° categoria"
e.Graphics.DrawString(categ1.Text, categ1.Font, Brushes.Black, PrintDocument1.DefaultPageSettings.PaperSize.Width / 2 - categ1.Width / 2, 150)
'stampo la prima DataGridView
Dim posX As Integer
Dim posY As Integer = e.MarginBounds.Top + 100
Dim rettangolo As Rectangle
Dim altezza As Integer = RisultatiPrimaDataGridView.RowTemplate.Height
Dim normalFont As Font = New Font("", 11)
Dim boldfont As Font = New Font("", 10, FontStyle.Bold)
Static righeStampate As Integer = 0
Static pagineStampate As Integer = 0
Dim righeTotali As Integer = RisultatiPrimaDataGridView.Rows.Count
Dim righePerPagina As Integer = e.MarginBounds.Height / altezza
Dim nPagine As Integer
If righeTotali Mod righePerPagina > 0 Then
nPagine = (righeTotali / righePerPagina) + 1
Else
nPagine = righeTotali / righePerPagina
End If
posX = (e.MarginBounds.Width - RisultatiPrimaDataGridView.Width) / 2 + e.MarginBounds.Left + 50
Dim dimensioneCella As System.Drawing.SizeF
For Each colonna As DataGridViewColumn In RisultatiPrimaDataGridView.Columns
dimensioneCella = e.Graphics.MeasureString(colonna.HeaderText.ToString, normalFont)
rettangolo = New Rectangle(posX, posY, colonna.Width, altezza)
e.Graphics.DrawRectangle(Pens.Black, rettangolo)
e.Graphics.DrawString(colonna.HeaderText, boldfont, Brushes.Black, posX, posY + 2)
posX += colonna.Width
Next
posY += altezza
Dim testo As String
For i As Integer = righeStampate To righeStampate + righePerPagina - 2
posX = (e.MarginBounds.Width - RisultatiPrimaDataGridView.Width) / 2 + e.MarginBounds.Left + 50
If i = righeTotali Then
e.HasMorePages = False
Exit For
End If
For Each colonna As DataGridViewColumn In RisultatiPrimaDataGridView.Columns
'stampo la posizione in classifica:
e.Graphics.DrawString(righeStampate + 1, normalFont, Brushes.Black, 50, posY + 2)
testo = RisultatiPrimaDataGridView.Rows(i).Cells(colonna.Name).Value.ToString
dimensioneCella = e.Graphics.MeasureString(testo.ToString, normalFont)
rettangolo = New Rectangle(posX, posY, colonna.Width, altezza)
e.Graphics.DrawRectangle(Pens.Black, rettangolo)
e.Graphics.DrawString(testo, normalFont, Brushes.Black, posX, posY + 2)
posX += colonna.Width
Next
righeStampate += 1
posY += altezza
Next
pagineStampate += 1
If pagineStampate < nPagine Then
e.HasMorePages = True
posY = e.MarginBounds.Top
Else
e.HasMorePages = False
righeStampate = 0
pagineStampate = 0
End If
'stampo "2° categoria"
e.Graphics.DrawString(categ2.Text, categ2.Font, Brushes.Black, (PrintDocument1.DefaultPageSettings.PaperSize.Width - categ2.Width) / 2, posY + 50)
'lascio un po' di spazio:
posY += 90
'stampo la seconda grid
righeStampate = 0
altezza = RisultatiSecondaDataGridView.RowTemplate.Height
righeTotali = RisultatiSecondaDataGridView.Rows.Count
posX = (e.MarginBounds.Width - RisultatiSecondaDataGridView.Width) / 2 + e.MarginBounds.Left + 50
For Each colonna As DataGridViewColumn In RisultatiSecondaDataGridView.Columns
dimensioneCella = e.Graphics.MeasureString(colonna.HeaderText.ToString, normalFont)
rettangolo = New Rectangle(posX, posY, colonna.Width, altezza)
e.Graphics.DrawRectangle(Pens.Black, rettangolo)
e.Graphics.DrawString(colonna.HeaderText, boldfont, Brushes.Black, posX, posY + 2)
posX += colonna.Width
Next
posY += altezza
For i As Integer = righeStampate To righeStampate + righePerPagina - 2
posX = (e.MarginBounds.Width - RisultatiSecondaDataGridView.Width) / 2 + e.MarginBounds.Left + 50
If i = righeTotali Then
e.HasMorePages = False
Exit For
End If
For Each colonna As DataGridViewColumn In RisultatiSecondaDataGridView.Columns
'stampo la posizione in classifica:
e.Graphics.DrawString(righeStampate + 1, normalFont, Brushes.Black, 50, posY + 2)
testo = RisultatiSecondaDataGridView.Rows(i).Cells(colonna.Name).Value.ToString
dimensioneCella = e.Graphics.MeasureString(testo.ToString, normalFont)
rettangolo = New Rectangle(posX, posY, colonna.Width, altezza)
e.Graphics.DrawRectangle(Pens.Black, rettangolo)
e.Graphics.DrawString(testo, normalFont, Brushes.Black, posX, posY + 2)
posX += colonna.Width
Next
righeStampate += 1
posY += altezza
Next
pagineStampate += 1
If pagineStampate < nPagine Then
e.HasMorePages = True
posY = e.MarginBounds.Top
Else
e.HasMorePages = False
righeStampate = 0
pagineStampate = 0
End If
'stampo "categoria NC"
e.Graphics.DrawString(categ3.Text, categ3.Font, Brushes.Black, (PrintDocument1.DefaultPageSettings.PaperSize.Width - categ3.Width) / 2, posY + 50)
'lascio un po' di spazio:
posY += 90
'stampo la terza grid
righeStampate = 0
altezza = RisultatiNCDataGridView.RowTemplate.Height
righeTotali = RisultatiNCDataGridView.Rows.Count
posX = (e.MarginBounds.Width - RisultatiNCDataGridView.Width) / 2 + e.MarginBounds.Left + 50
For Each colonna As DataGridViewColumn In RisultatiNCDataGridView.Columns
dimensioneCella = e.Graphics.MeasureString(colonna.HeaderText.ToString, normalFont)
rettangolo = New Rectangle(posX, posY, colonna.Width, altezza)
e.Graphics.DrawRectangle(Pens.Black, rettangolo)
e.Graphics.DrawString(colonna.HeaderText, boldfont, Brushes.Black, posX, posY + 2)
posX += colonna.Width
Next
posY += altezza
For i As Integer = righeStampate To righeStampate + righePerPagina - 2
posX = (e.MarginBounds.Width - RisultatiNCDataGridView.Width) / 2 + e.MarginBounds.Left + 50
If i = righeTotali Then
e.HasMorePages = False
Exit For
End If
For Each colonna As DataGridViewColumn In RisultatiNCDataGridView.Columns
'stampo la posizione in classifica:
e.Graphics.DrawString(righeStampate + 1, normalFont, Brushes.Black, 50, posY + 2)
testo = RisultatiNCDataGridView.Rows(i).Cells(colonna.Name).Value.ToString
dimensioneCella = e.Graphics.MeasureString(testo.ToString, normalFont)
rettangolo = New Rectangle(posX, posY, colonna.Width, altezza)
e.Graphics.DrawRectangle(Pens.Black, rettangolo)
e.Graphics.DrawString(testo, normalFont, Brushes.Black, posX, posY + 2)
posX += colonna.Width
Next
righeStampate += 1
posY += altezza
Next
pagineStampate += 1
If pagineStampate < nPagine Then
e.HasMorePages = True
posY = e.MarginBounds.Top
Else
e.HasMorePages = False
righeStampate = 0
pagineStampate = 0
End If
End Sub