Stampare più DataGridView con dimensione variaible

di il
14 risposte

Stampare più DataGridView con dimensione variaible

Ciao a tutti,
nel mio programma c'è un form che visualizza una classifica di giocatori, divisi in 3 categorie. Posto un'immagine per chiarezza (la terza grid non si vede ma è sotto)

Quello che vorrei è che quando l'utente clicca sul bottone stampa, vengano stampate le tre grid.
Già non so come fare questo ma ho visto che in rete ci sono vari esempi, quindi spero di cavarmela...
Il problema grosso è questo: le grid hanno una dimensione fissa mentre io a priori non so quanti giocatori conterrà ognuna di loro. Ovviamente non voglio stampare delle scroll bar quindi vorrei sapere se c'è il modo di "allungare" le grid al momento di stampare o anche prima (cioè dopo un inserimento che farebbe apparire le scroll bar).
Spero di essere riuscito a spiegarmi bene!
Grazie!

14 Risposte

  • Re: Stampare più DataGridView con dimensione variaible

    Ciao minomic
    La stampa di una o più tabelle non può essere fatta stampando lo schermo, una tabella potrebbe essere molto lunga e richiedere più pagine. Devi scrivere un pezzo di codice (abbastanza impegnativo) che gestisce la stampa dei tuoi dati. Si deve occupare dei salti pagina, delle intestazioni ecc.
    Si usa la classe PrintDocument, prova a guardarla, se ti serve una mano fa un fischio.
  • Re: Stampare più DataGridView con dimensione variaible

    Ok, immaginavo che la cosa non fosse facile... Proverò, poi ti faccio sapere
  • Re: Stampare più DataGridView con dimensione variaible

    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
  • Re: Stampare più DataGridView con dimensione variaible

    Ciao,
    ho fatto progressi e ho risolto il problema delle sovrapposizioni: la classifica di seconda categoria veniva stampata prima che fosse finita quella di prima. Ho risolto inserendo parecchi booleani (alcuni forse inutili) per controllare il processo di stampa. E' rimasto qualche problema con i salti di pagina. Spero che qualcuno abbia voglia di dare un'occhiata al codice e dirmi cosa non va!
    Grazie!
    
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Static finito_prima As Boolean = False
            Static finito_seconda As Boolean = False
            Static stampare_prima = True
            Static stampare_seconda = False
            Static stampare_NC = False
            Static prima_volta = True
    
            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
            Dim testo As String
    
            If prima_volta = True Then
                '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)
                prima_volta = False
            End If
    
            If stampare_prima = True Then
                'stampo la prima DataGridView
    
                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
    
                For Each colonna As DataGridViewColumn In RisultatiPrimaDataGridView.Columns
                    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 - 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
                        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
                    finito_prima = True
                    stampare_prima = False
                    stampare_seconda = True
                End If
            End If
    
            If finito_prima = True And stampare_seconda = True Then
                '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
                    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
                        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
                    finito_seconda = True
                    stampare_seconda = False
                    stampare_NC = True
                End If
    
            End If
    
            If finito_prima = True And finito_seconda = True And stampare_NC = True Then
    
                '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
                    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
                        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 If
    
        End Sub
    
  • Re: Stampare più DataGridView con dimensione variaible

    Ciao minomic,
    Urca! è un bel tocco di codice! E poi non so esattamente che problemi hai. Quale è il problema con i salti pagina ?

    Non sarebbe possibile fare tre o quattro distinte funzioni di stampa, una per ogni pezzo da stampare, che verranno richiamate in sequenza?
  • Re: Stampare più DataGridView con dimensione variaible

    barba59 ha scritto:


    Urca! è un bel tocco di codice!
    Eh già!
    Comunque alcuni problemi sono riuscito a risolverli (e sono molto fiero ) ma resta ancora qualche stranezza in questi salti di pagina. In particolare: se la classifica di prima categoria occupa più pagine viene stampata correttamente ma poi succedono cose strane con le altre due classifiche: vengono stampate più volte e in posizioni "strane", più in basso di quanto dovrebbero.
    Credo che il problema sia la relazione tra righe_totali e righe_stampate: quando ho finito di stampare una classifica, righe_stampate viene azzerato e quindi la nuova classifica riparte a contare da zero mentre una parte della pagina potrebbe essere occupata dalla fine della classifica precedente...
    Comunque continuerò a lavorarci. Posto una versione aggiornata del codice, se qualcuno ha voglia/tempo di darci un'occhiata:
    
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Static finito_prima As Boolean = False
            Static finito_seconda As Boolean = False
            Static stampare_prima = True
            Static stampare_seconda = False
            Static stampare_NC = False
            Static prima_volta = True
    
            Dim posX As Integer
            Dim posY As Integer
            Dim rettangolo As Rectangle
            Dim altezza As Integer = RisultatiPrimaDataGridView.RowTemplate.Height   'l'altezza delle righe è uguale nelle tre tabelle
            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
            Dim righePerPagina As Integer = (e.MarginBounds.Height - 100) / altezza   'e nella seconda pagina?
            Dim nPagine As Integer
            Dim testo As String
    
            If prima_volta = True Then
                '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)
                'prima_volta = False
            End If
    
            If stampare_prima = True Then
                'stampo la prima DataGridView
                If prima_volta = True Then
                    posY = e.MarginBounds.Top + 100
                    prima_volta = False
                Else
                    posY = e.MarginBounds.Top
                End If
    
                righeTotali = RisultatiPrimaDataGridView.Rows.Count
                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
    
                For Each colonna As DataGridViewColumn In RisultatiPrimaDataGridView.Columns
                    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 - 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
                        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
                    finito_prima = True
                    stampare_prima = False
                    stampare_seconda = True
                End If
            End If
    
            If finito_prima = True And stampare_seconda = True Then
                '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
                    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
                        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
                    finito_seconda = True
                    stampare_seconda = False
                    stampare_NC = True
                End If
    
            End If
    
            If finito_prima = True And finito_seconda = True And stampare_NC = True Then
    
                '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
                    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
                        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 If
    
        End Sub
  • Re: Stampare più DataGridView con dimensione variaible

    Ciao, volevo dirti che ho risolto i problemi. Erano legati alla gestione errata dei salti di pagina.
    Ora però avrei un'altra domanda: la mia classifica appare così

    Vorrei sapere se è possibile importarla in word per effettuare qualche modifica.
    A intuito direi di sì perchè alla fine tutto quello che faccio è scrivere delle stringhe o al limite disegnare dei rettangoli, però non so proprio da dove partire!
  • Re: Stampare più DataGridView con dimensione variaible

    Ho letto che forse sarebbe una buona idea usare crystal report. Proverò a leggere qualcosa in giro per internet, ma spero che qualcuno mi possa dare informazioni più precise.
  • Re: Stampare più DataGridView con dimensione variaible

    Ciao minomic
    Generare documenti Word non l' ho mai fatto, (excel però si), e pure Cristal Report non l' ho mai usato. Se trovi informazioni a riguardo sarei curioso pure io di saperle.
  • Re: Stampare più DataGridView con dimensione variaible

    Per quello che devo fare io (modificare qualche parte di testo) andrebbe bene pure excel...
  • Re: Stampare più DataGridView con dimensione variaible

    Ciao minonic
    Qui trovi le istruzioni in italiano: scritte da mamma Microsoft in persona.
    Se serve aiuto fa un fischio
  • Re: Stampare più DataGridView con dimensione variaible

    barba59 ha scritto:


    mamma Microsoft
    eheh la mamma è sempre la mamma!

    Comunque secondo te quale metodo mi conviene utilizzare per il mio caso (vedi foto sopra)?
  • Re: Stampare più DataGridView con dimensione variaible

    minomic ha scritto:


    Per quello che devo fare io (modificare qualche parte di testo) andrebbe bene pure excel...
    Non mi è chiaro cosa devi fare, se ti servono dei valori diversi perché non li editi direttamente nei DataGrid e poi li stampi?

    Comunque per curiosità ho cercato come generare dei documenti Word, ecco un esempio:
    Aggiungi un reference (nel tab COM) a 'Microsoft Word 12.0 Object Library'
    
            Dim wordApp As New Word.Application
            wordApp.Visible = True
            wordApp.Documents.Add()
            wordApp.Selection.TypeText("Cucu")
            wordApp.Documents(wordApp.Documents.Count).SaveAs("C:\temp\mydoc1.doc")
    
    Questo codice ti aprirà Word. Il probleme è che non funzionerà se sul computer non hai Word installato.
    Un' altra soluzione se vuoi distribuire dei documenti con le tue classifiche è generare dei pdf (però non sono modificabili, a meno che tu abbia il programma).

    Per generare i pdf devi importare una libreria esterna, ve ne sono diverse, io ho usato la libreria iTextSharp e va bene.
  • Re: Stampare più DataGridView con dimensione variaible

    barba59 ha scritto:


    se ti servono dei valori diversi perché non li editi direttamente nei DataGrid e poi li stampi?
    Sì in effetti potrei farlo, non ci avevo pensato... però mi servirebbe poter aggiungere delle parti di testo accanto alle posizioni della classifica, per distinguere i vari premiati della gara
    Adesso proverò a scrivere il codice che permetta di aggiornare il database in caso di modifiche nelle grid, poi ti faccio sapere come è andata.
    Grazie per tutti i suggerimenti!
Devi accedere o registrarti per scrivere nel forum
14 risposte