+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 10 su 10

Problemi con la stampa

  1. #1
    rashid non  in linea Novello
    Salve ragazzi!

    Ho un problema con la stampa.
    Devo stampare una serie di dati di una DGV. Il problema spunta quando si supera la prima pagina.
    Io ho scritto cos:

    codice HTML:
                If y > 1150 Then
                    e.HasMorePages = True
                    y = 0
                Else
                    e.HasMorePages = False
                End If
    dove y corrisponde all'ordinata del foglio.
    Anzich stampare i dati in una nuova pagina me li stampa all'inizio della stessa, sovrascrivendo quello che stato stampato prima.
    Come posso risolvere?

  2. #2
    Con queste poche indicazioni corretto. Se y la posizione verticale, se la azzeri sar ad inizio pagina.

    Non si capisce cosa intendi per "nuova pagina" e se parli proprio di stampante o cos'altro ...
    ℹ️ Leggi di pi su AntonioG ...

  3. #3
    rashid non  in linea Novello
    Effettivamente le mie indicazioni sono limitatissime
    Ho postato solo una piccola parte di codice, poich piuttosto lungo.

    In pratica devo stampare dei preventivi i cui dati sono inseriti in un DataGridView. Se il preventivo occupa una sola pagina non mi da nessun problema, se invece supera i limiti della pagina, i dati che vorrei fossero stampati a pagina 2 me li stampa sempre in pagina 1 sovrascrivendo l'intestazione e le prime righe del preventivo stesso.

    Posto comunque il codice:
        Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
            Dim righe, xpz, xum, xqta, xdesc, xprez, ximpor, y As Integer
            righe = DGVPrev.RowCount
            xpz = 10
            xum = 73
            xqta = 110
            xdesc = 200
            xprez = 630
            ximpor = 720
            y = 200
     
            Dim pz, qta, impor, prez, desc As String
            Dim drawFont = New Font("Arial", 9)
            Dim drawFont1 = New Font("Arial", 10, FontStyle.Bold)
            e.Graphics.DrawImage(PictureBox1.Image, 20, 30, 300, 50)
            e.Graphics.DrawString("PREVENTIVO N.", drawFont1, Brushes.Black, 20, 100)
            e.Graphics.DrawString(txtNumero.Text, drawFont, Brushes.Black, 160, 100)
            e.Graphics.DrawString("DEL", drawFont1, Brushes.Black, 230, 100)
            e.Graphics.DrawString(DateTimePicker1.Text, drawFont, Brushes.Black, 275, 100)
            e.Graphics.DrawString("CLIENTE", drawFont1, Brushes.Black, 20, 130)
            e.Graphics.DrawString(lblRagSoc.Text, drawFont, Brushes.Black, 120, 130)
            e.Graphics.DrawString("PZ", drawFont1, Brushes.Black, 20, 170)
            e.Graphics.DrawString("UM", drawFont1, Brushes.Black, 70, 170)
            e.Graphics.DrawString("QUANTITA'", drawFont1, Brushes.Black, 110, 170)
            e.Graphics.DrawString("DESCRIZIONE", drawFont1, Brushes.Black, 330, 170)
            e.Graphics.DrawString("PREZZO", drawFont1, Brushes.Black, 630, 170)
            e.Graphics.DrawString("IMPORTO", drawFont1, Brushes.Black, 720, 170)
            For i = 0 To righe - 1
                pz = Format(DGVPrev.Rows(i).Cells(11).Value, "#0.00")
                qta = Format(DGVPrev.Rows(i).Cells(12).Value, "#0.00")
                impor = Format(DGVPrev.Rows(i).Cells(14).Value, "#0.00")
                prez = Format(DGVPrev.Rows(i).Cells(13).Value, "#0.0000")
                desc = DGVPrev.Rows(i).Cells(10).Value
                e.Graphics.DrawString(pz.PadLeft(14 - pz.Length), drawFont, Brushes.Black, xpz, y)
                e.Graphics.DrawString(DGVPrev.Rows(i).Cells(17).Value, drawFont, Brushes.Black, xum, y)
                e.Graphics.DrawString(qta.PadLeft(14 - qta.Length), drawFont, Brushes.Black, xqta, y)
                e.Graphics.DrawString(prez.PadLeft(14 - prez.Length), drawFont, Brushes.Black, xprez, y)
                e.Graphics.DrawString(FormatNumber(impor, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(impor, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, ximpor, y)
                Do While desc.Length > 45
                        e.Graphics.DrawString(desc.Substring(0, 45), drawFont, Brushes.Black, xdesc, y)
                        desc = desc.Substring(45, desc.Length - 45)
                    y = y + 20
                Loop
                e.Graphics.DrawString(desc, drawFont, Brushes.Black, xdesc, y)
                y = y + 20
                If y > 1150 Then
                    e.HasMorePages = True
                    y = 0
                Else
                    e.HasMorePages = False
                End If
            Next
            y = y + 20
            e.Graphics.DrawString("TRASPORTO", drawFont1, Brushes.Black, 20, y)
            e.Graphics.DrawString(FormatNumber(txtTrasporto.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(txtTrasporto.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 20, y + 15)
            e.Graphics.DrawString("SCONTO", drawFont1, Brushes.Black, 20, y + 45)
            e.Graphics.DrawString(FormatNumber(txtSconto.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(txtSconto.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 20, y + 60)
            e.Graphics.DrawString("TOTALE IMPONIBILE", drawFont1, Brushes.Black, 620, y)
            e.Graphics.DrawString(FormatNumber(CDec(lblImpon22.Text) + CDec(lblImpon10.Text) + CDec(lblImpon5.Text) + CDec(lblEsente.Text), 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(txtTrasporto.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 650, y + 15)
            e.Graphics.DrawString("TOTALE IVA", drawFont1, Brushes.Black, 620, y + 45)
            e.Graphics.DrawString(FormatNumber(lblIVADoc.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(lblIVADoc.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 650, y + 60)
            If lblImpon5.Text = "0,00" Then
            Else
                e.Graphics.DrawString("IMPONIBILE 5%", drawFont1, Brushes.Black, 150, y)
                e.Graphics.DrawString(FormatNumber(lblImpon5.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(lblImpon5.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 270, y)
                e.Graphics.DrawString("IVA 5%", drawFont1, Brushes.Black, 400, y)
                e.Graphics.DrawString(FormatNumber(lblIVA5.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(lblIVA5.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 470, y)
                y = y + 15
            End If
            If lblImpon10.Text = "0,00" Then
            Else
                e.Graphics.DrawString("IMPONIBILE 10%", drawFont1, Brushes.Black, 150, y)
                e.Graphics.DrawString(FormatNumber(lblImpon10.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(lblImpon10.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 270, y)
                e.Graphics.DrawString("IVA 10%", drawFont1, Brushes.Black, 400, y)
                e.Graphics.DrawString(FormatNumber(lblIVA10.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(lblIVA10.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 470, y)
                y = y + 15
            End If
            If lblImpon22.Text = "0,00" Then
            Else
                e.Graphics.DrawString("IMPONIBILE 22%", drawFont1, Brushes.Black, 150, y)
                e.Graphics.DrawString(FormatNumber(lblImpon22.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(lblImpon22.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 270, y)
                e.Graphics.DrawString("IVA 22%", drawFont1, Brushes.Black, 400, y)
                e.Graphics.DrawString(FormatNumber(lblIVA22.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(lblIVA22.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 470, y)
                y = y + 15
            End If
            If lblEsente.Text = "0,00" Then
            Else
                e.Graphics.DrawString("ESENTE IVA", drawFont1, Brushes.Black, 150, y)
                e.Graphics.DrawString(FormatNumber(lblEsente.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(lblEsente.Text, 2, , , TriState.UseDefault).Length), drawFont, Brushes.Black, 270, y)
            End If
            e.Graphics.DrawString("TOTALE PREVENTIVO", drawFont1, Brushes.Black, 620, y + 90)
            e.Graphics.DrawString(FormatNumber(lblTotDoc.Text, 2, , , TriState.UseDefault).PadLeft(14 - FormatNumber(lblTotDoc.Text, 2, , , TriState.UseDefault).Length), drawFont1, Brushes.Black, 650, y + 110)
        End Sub
    

    Quote Originariamente inviato da AntonioG Visualizza il messaggio
    Non si capisce cosa intendi per "nuova pagina" e se parli proprio di stampante o cos'altro ...
    Per nuova pagina intendo proprio la pagina fisica (il foglio A4), e si parlo di stampante.

    Grazie per la tua risposta, e soprattutto per la pazienza

  4. #4
    La HasMorePage va alla fine della Sub di stampa della pagina... perch tu continui con altro codice?
    ℹ️ Leggi di pi su AntonioG ...

  5. #5
    L'avatar di SirJo
    SirJo non  in linea Scolaretto
    Forse non ti molto chiaro il flusso.
    La routine PrintDocument1_PrintPage viene chiamata ad ogni pagina che deve essere stampata.
    Dentro nella routine devi quindi tenere traccia sia del valore Y ma anche del numero della pagina dove stai stampando.
    La prima volta che viene chiamata questa routine troverai quindi nPage = 1 e farai quello che devi fare.
    Nel momento in cui ti trovi Y > 1150 metti Y = 0, nPage = 2, poi e.HasMorePages = True e poi un Exit Sub
    A questo punto la routine PrintDocument1_PrintPage viene chiamata di nuovo, e dovrai quindi gestire il tutto basandoti su nPage

    Spero ti sia chiaro, altrimenti chiedi pure

  6. #6
    rashid non  in linea Novello
    Grazie SirJo, ma non ci sto capendo nulla.
    Ho provato il tuo suggerimento, ma quando metto Exit Sub mi stampa infinite volte solo la prima pagina.

    Allego in pdf il risultato che mi dava il codice che ho postato ieri. Si avvicina molto a quello che voglio ottenere.

    https://drive.google.com/file/d/1IDU...ew?usp=sharing

  7. #7
    Per capire bisogna dare un'occhiata alla documentazione teorica e poi scrivere codice.

    Inutile postare codice per farlo scrivere da altri.

    In quella sub viene stampata la pagina corrente. La HasMorePage va messa a true solo se hai un'altra pagina da stampare e va messa a false se non ne hai pi. Questo lo determini tu, tramite un contatore di pagine o altro metodo.
    Se la HasMorePage sempre true, avrai una stampa infinita.

    Fai una ricerca anche su questo forum, ad esempio

    https://masterdrive.it/visual-basic-...ocument-45972/
    ℹ️ Leggi di pi su AntonioG ...

  8. #8
    rashid non  in linea Novello
    Quote Originariamente inviato da AntonioG Visualizza il messaggio
    Per capire bisogna dare un'occhiata alla documentazione teorica e poi scrivere codice.
    Sono d'accordo. Anzi aggiungo che bisogna dare un'occhiata anche ad altri forum in cui si parla di questo argomento. Ed quello che faccio di solito.

    Nel mio caso la HasMorePage True solo se y maggiore di 1150. Il codice che ho postato ieri non mi fa la stampa infinita. Questo avviene solo se aggiungo la Exit Sub, come suggerito da SirJo.
    la stessa cos avviene se sposto la HasMorePage alla fine, come suggerito da te.
    Il problema del mio codice che ci che io vorrei che mi stampasse sulla seconda pagina lo sovrascrive nella prima, come si pu vedere dal file pdf che ho allegato.

    Grazie ancora per il tempo e per la pazienza che mi dedicate. A buon rendere

  9. #9
    Scusa ma stai ripetendo quello che gi abbiamo visto e discusso.

    Non va inserita una Exit Sub ma la HasMorePage deve essere impostata proprio prima della End Sub perch in quel punto che la pagina corrente termina e si deve indicare se ne esiste un'altra.

    All'inizio della stampa dovresti avere un contatore delle pagine totali che devi utilizzare per determinare la HasMorePage. Il numero di pagine totali pu essere determinato *prima* di iniziare a stampare la prima.

    Guarda qualche esempio

    https://docs.microsoft.com/it-it/dot...e?view=net-5.0

    https://docs.microsoft.com/it-it/dot...s?view=net-5.0
    Ultima modifica di AntonioG; 11-05-2021 11:21 
    ℹ️ Leggi di pi su AntonioG ...

  10. #10
    L'avatar di SirJo
    SirJo non  in linea Scolaretto
    Rileggi bene il mio post perch ti ho dato tutti gli elementi che ti servono, ma a quanto pare non lo hai seguito.


    La prima volta che viene chiamata la ruotine PrintDocument1_PrintPage tu stampi la pagina numero 1, e fin qui tutto ok, poi ti accorgi che Y > 1150, metti HasMorePage a true, DEVI mettere nPage = 2 e fare un Exit Sub.

    A questo punto la rounte PrintDocument1_PrintPage viene chiamata di nuovo, ma hai messo dentro alla routine un controllo per vedere se nPage 1 o 2 e proseguire di conseguenza ??
    No, non lo hai fatto, per cui la routine f di nuovo quello che ha fatto prima, cio stamparti di nuovo la stessa pagina e fare di nuovo tutto come prima, quindi ovvio che ti stampi sempre la stessa pagina all'infinito

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. problemi di stampa...
    Da Bix Bicio nel forum Visual Basic 6
    Risposte: 7
    Ultimo Post: 22-12-2011, 19:05
  2. Problemi di stampa
    Da worldvb nel forum Visual Basic .Net
    Risposte: 6
    Ultimo Post: 19-12-2006, 06:45
  3. Problemi con la stampa form
    Da angelo34 nel forum Visual Basic 6
    Risposte: 1
    Ultimo Post: 29-04-2005, 17:50
  4. Problemi con la Stampa
    Da keanurives nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 04-03-2005, 22:41
  5. Problemi con la stampa
    Da claudar nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 13-08-2004, 12:20