Stampare DataGridView

domenica 10 febbraio 2008 - 12.27

walter.tomiati.90 Profilo | Junior Member

Salve,
ho la necessità di scrivere un codice in vb 2005 per stampare una datagridview...e possibile ???

Tomiati Walter
---> Gabba, Gabba, Hey !!! <---

hidden Profilo | Newbie

>Salve,
>ho la necessità di scrivere un codice in vb 2005 per stampare
>una datagridview...e possibile ???
>
>Tomiati Walter
>---> Gabba, Gabba, Hey !!! <---

Certo devi sapere che anche se molto complesso il componente PrintDocument è molto potente
utilizza il codice che ti posto e vedrai che stampa per di più nella prima pagina ti lascia anche dello spazio in alto per stampare l'intestazione.

N.B. KDResoconto è il nome della tua datagridView

Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Try
Static RigheStampate As Integer
Static PagineStampate As Integer
Static MiePagine As Integer

Dim RigheTotali As Integer = KDResoconto.Rows.Count
Dim ControllaPagine As Boolean = True

Dim Rect As Rectangle
Dim RectQuality As Rectangle
Dim ColCorrente As Integer = 0

Dim Top As Integer = 25 ' e.MarginBounds.Top
Dim Left As Integer = 25 ' e.MarginBounds.Left
Dim Height As Integer = KDResoconto.RowTemplate.Height

Dim MaxRighe As Integer = e.MarginBounds.Height / Height
Dim MaxPagine As Integer = KDResoconto.Rows.Count / MaxRighe
Dim MPX As Integer = (KDResoconto.Rows.Count \ MaxRighe) + 1

Dim BrHeader As SolidBrush = New SolidBrush(Color.Gray)
Dim Hfont As Font = KDResoconto.Font
Dim Fc As String
Dim Fr As String

For Each col As DataGridViewColumn In KDResoconto.Columns
Fc = ""
Dim ColText As String = col.HeaderText
Dim Sz As System.Drawing.SizeF = e.Graphics.MeasureString(ColText, Hfont)
While Sz.Width > col.Width
ColText = ColText.Remove(ColText.Length - 1, 1)
Sz = e.Graphics.MeasureString(ColText + "...", Hfont)
Fc = "..."
End While
Rect = New Rectangle(Left, Top, col.Width, Height)
e.Graphics.FillRectangle(BrHeader, Rect)
e.Graphics.DrawString(ColText + Fc, Hfont, Brushes.Black, Left, Top + (e.Graphics.MeasureString(ColText, Hfont).Height / 2))
Left += col.Width
If Left > e.PageBounds.Right - 25 Then
MsgBox("Attenzione i campi da stampare sono troppi e la stampa non sarà effettuata correttamente" + Chr(13) + Chr(13) + "Possibili Soluzioni:" + Chr(13) + " .Impostare la stampa in modo Orizzontale" + Chr(13) + " .Selezionare un foglio di dimensioni maggiori" + Chr(13) + " .Ridurre il numero di campi da stampare", MsgBoxStyle.Information)
Exit For
End If
Next

Dim BrRow As SolidBrush = New SolidBrush(Color.Transparent)
Dim PnRow As Pen = New Pen(Color.Black)
Dim RigaCorrente As Integer = 0

For RigaCorrente = RigheStampate To RigheStampate + MaxRighe
Left = 25 ' e.MarginBounds.Left
Top += Height
For Each col As DataGridViewColumn In KDResoconto.Columns
Fr = ""
Dim CelText As String = KDResoconto.Rows(RigaCorrente).Cells(col.Name).Value.ToString
Dim Sz As System.Drawing.SizeF = e.Graphics.MeasureString(CelText, Hfont)
While Sz.Width > col.Width
CelText = CelText.Remove(CelText.Length - 1, 1)
Sz = e.Graphics.MeasureString(CelText + "...", Hfont)
Fr = "..."
End While
Rect = New Rectangle(Left, Top, col.Width, Height)
e.Graphics.FillRectangle(BrRow, Rect)
e.Graphics.DrawRectangle(PnRow, Rect)
e.Graphics.DrawString(CelText + Fr, Hfont, Brushes.Black, Left, Top + (e.Graphics.MeasureString(CelText, Hfont).Height / 2))
Left += col.Width
Next
RigheStampate += 1

MiePagine = PagineStampate + 1
If RigheStampate >= KDResoconto.Rows.Count Then
ControllaPagine = False
e.HasMorePages = False
RigheStampate = 0
PagineStampate = 0
Exit For
End If
Next RigaCorrente

If ControllaPagine Then
PagineStampate += 1

If PagineStampate < MaxPagine Then
e.HasMorePages = True
Else
e.HasMorePages = False
RigheStampate = 0
PagineStampate = 0
End If
End If

BrHeader.Dispose()
BrRow.Dispose()
PnRow.Dispose()

Catch ex As Exception
MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub

In più aggiungi un pulsante e gestisci così l'evento click


Private Sub Stampa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Stampa.Click
If (KOrizzontale.Checked) Then 'CheckBox per selezionare la stampa orizzontale
PrintDocument1.DefaultPageSettings.Landscape = True
PageSetupDialog1.PageSettings.Margins.Bottom = 360
PageSetupDialog1.PageSettings.Margins.Left = 0
PageSetupDialog1.PageSettings.Margins.Right = 0
PageSetupDialog1.PageSettings.Margins.Top = 0
Else
PageSetupDialog1.PageSettings.Landscape = False
PageSetupDialog1.PageSettings.Margins.Bottom = 360
PageSetupDialog1.PageSettings.Margins.Left = 0
PageSetupDialog1.PageSettings.Margins.Right = 0
PageSetupDialog1.PageSettings.Margins.Top = 0
End If
PageSetupDialog1.ShowDialog()
PrintPreviewDialog1.WindowState = FormWindowState.Maximized
PrintPreviewDialog1.PrintPreviewControl.Zoom = 1
PrintPreviewDialog1.ShowDialog(Me)
End Sub


Spero di esserti stato d'aiuto. Se hai ancora bisogno di aiuto non esitare a chiedere. Comunque se cerchi un po in giro su google puoi anche trovare qualche esempio. Però se hai altri problemi ti posso inviare io qualche esempio già bello e pronto.

alexmed Profilo | Guru

Ciao
sto usando anch'io questa procedura per stamapare il contenuto di un datagridview.
Ma è un paio di giorni che ci giro intorno ma non riesco ad accodargli un'altra datagridview.
In pratica dopo aver stampato il contenuto di una dgv che contiene alcune righe (una decina) vorrei stampare una seconda dgv che carico da un database.
Se ti venisse in mente qls fammelo sapere

Grazie ancora

alexmed

Alexia Profilo | Newbie

Ciao scusate se combinerò qualche paciugo, ma non sono molto pratica.....
non me ne capisco molto di programmazione anzi quasi nulla.....
mi cimento solo per divertimento e passione.... ma questa passione ha fatto in modo che mi andassi a impelagare in cose piu grandi della mia conoscenza... ora vengo al dunque.... tempo fa ho fatto un lavoretto con excel per un mio amico e direi che è uscito egreggiamente bene.... si trova su youtube sotto alexia8520 è un database..... se non chè ogni tanto excel fa qualche capriccio con le formattazioni nelle celle... e cosi ogni 2 o 3 mesi devo riprendere gli errori di format... allora ho pensato bene di provare a farlo con vb 2008 express...
procedevo troppo bene... era un sogno... ma nel momento in qui ho bisogno di progettare un qualcosa che mi manda in stampa il trimestre o tutta la lista ufficio... un MURO gigante
ho cercato da tutte le parti ma senza arrivare a qualcosa di concreto... ci metto il fatto che non me ne capisco quasi nulla e xciò gran parte del muro è costruito da me
io sto facendo questo database in vb. ed avendo l'express non ho il crystalreport e nulla che possa (da quanto ho capito) semplificare una stampa di un datagrid.... posseggo visual studio 2005 originale regalatomi da un mio Amico che xò si è trasferito e cosi ho perso tutti i contatti....
in questa copia c'è anche crystal etc etc se ritenete necessario che installo quello per facilitarmi nel progetto son pronta a farlo ma Vi prego AIUTOOOOOO
p.s. se vedete su youtube Vi rendete conto a grandi linee di cosa ho bisogno Grazie Mille

alexmed Profilo | Guru

Ciao
In allegato trovi un progetto per la stampa del DataGridView.
Io uso le versioni express quindi niente Crystal Reports.

Se hai bisogno chiedi pure.

Il progetto originale lo trovi qui:
http://www.codeproject.com/KB/grid/PrintDataGridView.aspx
dove trovi anche come si usa.




alexmed

Alexia Profilo | Newbie

Cavoli ......................
non ci capisco lo stesso
sarà meglio che mi prendo qualche libro

alexmed Profilo | Guru

Ciao
se mi dici cosa non ti è chiaro magari posso spiegartelo.

alexmed

Alexia Profilo | Newbie

Punto Primo Grazie della cortese Attenzione e della Gentilezza...
Ti Spiego il Tutto....
Appena ho Aperto il Tuo lavoro mi sono trovata paura perchè non ci capivo nulla.... poi anche le spiegazioni in inglese
non sono per niente a conoscenza della lingua... capisco le cose basilari e poi mi aiuto con google traduttore... comnq non è solo questo il fatto xqui mi sono spaventata
Allora 1) ho provato a lincare dove Tu mi hai messo a disposizione. e dove Tu dici che ci sono anche le spiegazioni tutto in madre lingua e poi di li ho provato a scaricare i progetti ma non c'è stato verso..
ho provato e riprovato (deducevo che forse mi sarei dovuta registrare e ho provato a mettere i dati ) ma nulla.... cmnq no problem ho tirato giu il Tuo lavoro.... e appena l'ho aperto Mamma Mia
mi sono persa d'animo.... poi invece con un pò di coraggio mi ci sono messa dietro.... ora vengo al dunque (scusa se mi dilungo ma devo per farTi capire anche la mia conoscenza in materia)
Sul mio lavoro ho creato una nuova form3 dove ho copiato e incollato tutto il tuo lavoro. e poi modificato con il mio db... e invece che Persons, l'ho nominato con il mio che è semplidemente db1... e la cartella si chiama data... fino qui tutto bene.... ma mi sono accorta che il Tuo lavoro mi va a prendere il data cosi come è.... mentre invece io dalla form2 che è quella che mi trova i clienti con una query dove filtro per DATE.... cioè dal mese anno al mese anno.... e poi di li devo mandare in stampa......
cerco di spiegarmi meglio come è il mio lavoro... form1 login... form2 gestione clienti.... cosi ché ho messo un datagridview sulla form2 (scegli origine dati) ho selezionato DatabindingSource.... io poi da li ho le varie funzioni di ricerca e di filtraggio... compreso quella per il trimestrale.... una volta filtrato mi recupera chessò 20 clienti?? bene io "vorrei" mandare in stampa solo quelli....
Spero di essermi spiegata abbastanza bene.... e scusami se ho scritto un libro
Grazie di Nuovo

alexmed Profilo | Guru

Ciao
non c'è nulla di cui aver paura, soprattutto se sei riuscita già a importare i dati sul DataGridView dal database.

Devi semplicemente fare 2 passaggi:
1. copiare il file "PrintDGV.vb" che trovi sotto la cartella del progetto "PrintDataGridView" nella cartella del tuo progetto.
2. creare un button e nell'evento click mettere il codice che manderà in stampa la tua DGV

Trascini un button sul Form2 --> lo rinomini in btnStampaDataGridView --> doppio click sul butto e nel codice metti:

PrintDGV.Print_DataGridView(qui_metti_il_nome_della_tua_DataGridView)

Quindi una cosa del genere

Private Sub btnStampaDataGridView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStampaDataGridView.Click
PrintDGV.Print_DataGridView(DataGridView1)
End Sub

Fammi sapere





alexmed

Alexia Profilo | Newbie

Ciao....
Scusa se non ti ho Rispsto prima.... per via che mi si è guastata la chiavetta.... e dato che intanto volevo prendere quella della tre stasera ho colto l'occasione..... fino ad ora non posso lamentare nulla....
loro dicono tenetevi forte xche si naviga a chissà che velocità..... non è proprio così..... ma non mi lamento.... solo x il fatto che navigo per 300 ore a 20 € contro le 100 ore a 30€..... ma valli a capire cosa e come mai tutti non si adeguano alle stesse cifre e piani..... cmnq lasciando perdere il tutto.....
sei Stato un GRANDE
mi hai risolto un problema che mai e poi mai sarei riuscita ad uscirne....
sei stato veramente Fantastico.......
solo una cosa mi fa rabbia tra Virgolette "" una cosa abbastanza facile a vedersi.... e io non ne sarei mai venuta a capo neanche se avessi avuto 100 vite a disposizione....
ma cosa devo fare?? cosa devo leggere per riuscire a capire "" almeno in parte dove possono essere i problemi per poi cercare nel punto giusto per risolverli???.....
Ora tre cose sempre legate al tuo Allegato
1) la tua form Print Option c'è la possibilità di passarla su vb2008?? giusto per non rifare tutto il lavoro in vb2005... se non si può no problem lo riscrivo tutto o x lo - in parte...
io ho provato a inserirlo mi vedeva tutto meno la form.. cosi ché mi portava errori su errori.. ho scelto la via più breve l'abbandono
2) c'è quella funzione dove puoi inserire dello scritto a inizio report"" (Funzione Bella e Utilissima) ma sul lato Dx appare data e ora quella posso eliminarla??
3) Questo lo dico per chi come me non se ne capisce un gran che... ma che per la fortuna mia mi è venuto in mente di cliccare con il Dx e leggere INSERISCI NEL PROGETTO.... perche quando ho fatto quello che mi Hai Detto Tu: Devi semplicemente fare 2 passaggi:
1. copiare il file "PrintDGV.vb" che trovi sotto la cartella del progetto "PrintDataGridView" nella cartella del tuo progetto.
2. creare un button e nell'evento click mettere il codice che manderà in stampa la tua DGV.....................
ma una volta aperto vb2005 ho dovuto fare: INSERISCI NEL PROGETTO... senno non mi vedeva nulla.... mi ero gia quasi arresa
Sei Stato Gentilissimo.... Sei Stato Veramente Grande.... Grazie Mille......
Non ci sono Pagine per poterTi Ringraziare......
poi se sarà possibile disturbarti per eventuali problemi spero di poterTi disturbare.....
P.S. Siete dei Maghi... un sacco di volte leggo nei forum di gente con dei problemi tipo me.. che non sanno più dove girarsi e che Voi risolvete con una Estrema facilità direi presso ché disarmante. da farci sentire piccoli ignoranti....
Di Nuovo Mille Grazie




Alexia Profilo | Newbie

Scusa Correggimi se Sbaglio riguardo a quella domanda su come togliere la data che mi metteva sulla Stampa... guardando sul Tuo Progetto e cioè PrintDGV ho visto questo codice che ora Ti incollo: 'Dim s As String = Now.ToLongDateString + " " + Now.ToShortTimeString

'e.Graphics.DrawString(s, New Font(dgv.Font, FontStyle.Bold), _
'Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - _
'e.Graphics.MeasureString(s, New Font(dgv.Font, FontStyle.Bold), _
'e.MarginBounds.Width).Width), e.MarginBounds.Top - _
' e.Graphics.MeasureString(PrintTitle, _
' New Font(New Font(dgv.Font, FontStyle.Bold), FontStyle.Bold), _
' e.MarginBounds.Width).Height - 13)
ho solo messo ' per annullare l'esecuzione per provare... e ho visto che la data è sparita....
ma se Tu mi ci dai un occhiata, puoi vedere se non incappo in qualche Errore.....
Grazie Grazie Grazie.....

alexmed Profilo | Guru

Ciao
Vedo che te la cavi benissimo!
Nonostante le mie indicazioni errate tra l'altro.

Per quanto riguarda il form "PrintOptions" non ci sono problemi a passarlo su 2008, importalo come hai fatto per la classe "PrintDGV.vb"

Fammi sapere
Ciao

alexmed

Alexia Profilo | Newbie

Ciao.......
Non Dirlo manco x scherzo: i tuoi errori
sono cose che Tu vedi Palesi
Sei Stato di Grandissimo Aiuto e senza il Tuo Aiuto avrei buttato tutto all'aria....
cmnq io c'ho provato a passare il tutto su 2008 e ho fatto: inserisci nel progetto ma la form opzioni non me la vede
rimane la cartellina bianca e pur facendo quel passaggio rimane sempre bianca....
e se provo ad aprire la form mi da solo le immagini dei tre tasti...
dove sbaglio???


Retifico il Messaggio
Mi sono Passata tutto il lavoro ma solo il Codice... in riguardo alla form lo rifatta papale papale.... tutto ok... non mi segnala nessun errore... se non ché quando lancio l'applicazione e mando in stampa.... Errore: Riferimento a un Oggetto non impostato su un'istanza di oggetti ma che cavolo vuole ancora??? ...

alexmed Profilo | Guru

è una segnalazione generica, l'errore potrebbe non essere collegato alla stampa della DGV.
Quando ti dà l'errore dovrebbe segnalarti anche la riga evidenziandotela in giallo.
Posta anche quella riga per iniziare a capire.

alexmed

Alexia Profilo | Newbie

Nulla nessuna Riga.... io ho compilato "" il tutto copiando e incollando tutto il codice sulla form rifatta exnovo....
quando premo F5 mi si apre il programma... tutto fila liscio... quando chiedo la stampa mi si apre la form printoptions... e fin qui tutto bene l
ascio invariato il tutto e do OK
a quel punto mi scrive quello che ti ho detto... e 0errori... 0avvisi... 0 messaggi....

alexmed Profilo | Guru

Così è un pò difficile capire il problema, se vuoi passami il progetto che gli dò un'occhiata.
Il mio indirizzo: alexmed@tiscali.it

alexmed

Alexia Profilo | Newbie

Cavoli...
lo Sistemo un attimo per via che essendo in progettazione con vari pulsanti ci capisco io... solo per il fatto che al momento non sapendo cosa che funzioni farle fare allora hanno nomi che non ti ci potresti orientare......
e comunque faccio cosi io ti invio il mio originale...
e se non è troppo uno sbattimento hai tu sia la soluzione che anche il progetto tuo per aggiungere il tutto...
anche xche se c'è qualche sbaglio... (e c'è di sicuro) ti aumenterei la pena

Alexia Profilo | Newbie

Direi che a Gentilezza e Solerzia è Davvero da Premiare....
Grazie della correzione... Grande Correzione..
Vorrei "" chiedere se si può lavorare sui margini della stampa sul tuo modulo DGV.vb.... per via che ho bisogno di tutto lo spazio che mi offre il foglio.... perciò se si poteva impostare i margini un pò più in altezza e larghezza....

Grazie INFINITE
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5