Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB. NET] E adesso... stampiamo con Crystal Report!
Forum - C# / VB.NET - [VB. NET] E adesso... stampiamo con Crystal Report!

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
aragorn76 (Normal User)
Newbie


Messaggi: 17
Iscritto: 10/04/2014

Segnala al moderatore
Postato alle 12:56
Martedì, 16/06/2020
Ciao a tutti,
eccomi di nuovo con un altro quesito molto interessante dove però non sono molto afferrato e dove non riesco a trovare utili guide.. :(

Ho un form che allego come esempio. Dentro il form:
2 datetimepicker
3 button
1 PrintPreviewControl1
1 datagridview1 (non visibile)

Come ben avrete capito, vorrei stampare i valori della datagridview1 nella zona grigia del documento (che sia poi possibile salvare in word o pdf o stampare). Questo documento deve avere un logo, un intestazione, numero pagina e una firma.

lasciando stare i valori delle 2 datetimepicker e volendo prendere tutti i valori nella DGV, ecco quello che sono riuscito a fare:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub PrintDocument1_PrintPage(sender As Object, e As Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
  2.  
  3.         Dim fon As New Font("Time New Roman", 14)
  4.         Dim primariga As String = "esempio prima riga"
  5.         Dim secondariga As String = "esempio seconda riga"
  6.         Dim terzariga As String = "esempio terza riga"
  7.         Dim numpag As Integer
  8.         Dim logo As Drawing.Image = My.Resources.replogo
  9.  
  10.  
  11.         'logo e intestazione
  12.         e.Graphics.DrawImage(logo, 350, 30, 100, 100)
  13.         e.Graphics.DrawString(primariga, fon, Brushes.Black, 250, 150)
  14.         e.Graphics.DrawString(secondariga, fon, Brushes.Black, 280, 170)
  15.         e.Graphics.DrawString(terzariga, fon, Brushes.Black, 270, 190)
  16.  
  17.         'nr pagina
  18.         e.Graphics.DrawString("Pagina nr. " & numpag, fon, Brushes.Blue, 650, 220)
  19.  
  20.         'titolo cella
  21.         e.Graphics.DrawString("Utente         Orario          Descrizione", New Font("Time New Roman", 12), Brushes.Blue, 50, 370)
  22.  
  23.         'valori datagridview
  24.        
  25.       ' -> Qui il problema <-
  26.  
  27.  
  28.         'firma
  29.         e.Graphics.DrawString("L'Operatore                                                            L'Ufficiale di P.G.", fon, Brushes.Blue, 80, 1000)
  30.  
  31.     End Sub
  32.  
  33.  
  34.  Private Sub stampa_Click(sender As Object, e As EventArgs) Handles stampa.Click
  35.         PrintDialog1.Document = PrintDocument1
  36.         If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.Yes Then
  37.             PrintDocument1.Print()
  38.         End If
  39.     End Sub



Con questo codice ho ricreato quello che vedete nel form.. anche se il codice (essendo ripeto la prima volta che uso questo comando) mi sembra un po come la La corazzata Potëmkin (secondo fantozzi) :asd::asd:

Iniziamo dal dire che il button stampa non funge e non capisco perche.. forse sbaglio nell'indicare cosa stampare.. boh
Vorrei sapere intanto se il codice che ho scritto è giusto e come faccio a dire che il logo deve essere messo al centro?
Inoltre devo indicare il numero per ogni pagina.

Ma passiamo al problema principale: vorrei che si prendessero i dati dal datagridview1 e che i valori vengano messi in automatico nella parte grigia.. tenendo conto però che magari nella prima pagina potrei avere 10 record (in quanto le descrizioni sono piccole) ma nelle pagine a seguire avere magari solo 5 record ad esempio, perche ogni record ha una descrizione lunga che potrebbe prendere piu righe... importante che non superi lo spazio predisposto o arriverebbe sulla "Firma"..

Facendo questo poi credo che facendo Salva su word o stampa, dovrebbe tenere la formattazione... Ogni piccolo aiuto sarà per me un passo grande.. Grazie a tutti in anticipo ;):hail:


aragorn76 ha allegato un file: test.jpg (45864 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da aragorn76 il 26/06/2020 alle 16:20
PM Quote
Avatar
Henry 128 (Member)
Pro


Messaggi: 61
Iscritto: 20/03/2008

Segnala al moderatore
Postato alle 1:48
Mercoledì, 17/06/2020
Posso iniziare ad aiutarti sul posizionamento, ovvero sul come disporre gli elementi sulla Page.
Per definire una posizione di un punto su una pagina ti serve conoscere la sua coordinata orizzontale e quella verticale rispetto a un punto di riferimento.
Quando chiami i metodi DrawImage e DrawString passi come argomento dei numeri interi, in realtà stai passando delle coordinate dei punti, quindi devi controllare i valori che hai messo se non ti tornano.
Ti suggerisco di utilizzare dei Point e non passare direttamente dei numeri per rendere il codice più leggibile.
Per trovare il centro tra due punti è sufficiente sommare i Point estremi e dividere per 2, in campo intero.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 694
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 15:11
Mercoledì, 17/06/2020
Per stampare, prima devi creare la pagina (documento)
Se il documento va indirizzato solo alla stampante, le coordinate che userai saranno riferite alla dimensione del foglio di stampa.
Non ci sono scorciatoie, ogni cosa che vuoi va posizionata, e diverso è l'approcio se è un testo, una grafica o i dati di un database.
Se il documento ti interessa anche in Word, è meglio prima creare il documento Word, e poi stampare quello.
https://support.microsoft.com/it-it/help/316383/how-to-auto ...

L'unica scorciatoia che potresti perseguire è stampare il Form così come è visualizzato.
https://docs.microsoft.com/it-it/dotnet/framework/winforms/ ...
Agendo sulle coordinate di cattura e dimensione si può anche stampare una zona specifica del form.

Importante, quando si lavora con la stampante, inevitabilmente le prove per raggiungere il risultato voluto saranno numerose, per non sprecare carta ti consiglio di impostare come stampante predefinita Microsoft XPS Document Writer, il documento verrà stampato in un file attraverso una stampante virtuale. Il file così creato avrà estensione .xps e si aprirà con "XPS viewer"

Per scegliere invece il device di stampa devi usare lo strumento: PrintDialog1
Per avere una preview di stampa: PrintPreviewControl1
Per stampare con preview: PrintPreviewDialog1


Ultima modifica effettuata da Carlo il 17/06/2020 alle 16:43


in programmazione tutto è permesso
PM Quote
Avatar
aragorn76 (Normal User)
Newbie


Messaggi: 17
Iscritto: 10/04/2014

Segnala al moderatore
Postato alle 16:54
Mercoledì, 17/06/2020
Grazie intanto per le risposte..
cavolo credevo fosse piu semplice.. 8-|

Adesso mi studio la parte word, anche se questo presuppone credo che nel PC ci sia installato il word altrimenti mi darebbe errore... ma poi per inserire la DGV nel corpo della pagina come dovrei fare? cioè come detto prima non posso mettere che so 10 record per pagina... :(

non ho proprio idea su come fare..


PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 694
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 21:10
Mercoledì, 17/06/2020
Per creare un documeto word con l'automazione, office word deve essere installato.

Il contenuto del datagridview, proviene sicuramente da un database.
Quando crei la pagina devi leggere i dati che ti interessano dal database o dal datagridview e posizionarli nel documento word.
Se vuoi una tabella tipo datagridview, la puoi creare e riempire con i comandi word.
Se il datagridview, con i dati caricati del caso, ti piace così come è mostrato sul form, lo puoi far diventare un'immagine grafica e inserire l'immagine corrispondente sul documento word.

Quanti record per pagina puoi mettere dipende da cosa contengono, devi gestire lo spazio a disposizione, nella stampa non ci sono scrollbar :asd::asd:

Qui: http://www.pierotofy.it/pages/sorgenti/dettagli/19605-Exce ...
ho pubblicato un esempio di come si crea un foglio excel con l'automazione, i principi sono gli stessi per creare un documento word, c'è anche il salvataggio in PDF.

Ultima modifica effettuata da Carlo il 18/06/2020 alle 10:30


in programmazione tutto è permesso
PM Quote
Avatar
aragorn76 (Normal User)
Newbie


Messaggi: 17
Iscritto: 10/04/2014

Segnala al moderatore
Postato alle 12:49
Giovedì, 18/06/2020
Si, avevo già esportato su excel.. ma mai impostando la pagina..
Adesso sto vedendo per un altro approccio..

Vorrei utilizzare crystal report.. quindi collegando un file rpt al mio progetto.. credo che con questo strumento molte cose sono automatizzate... trovato il modo per integrarlo al mio progetto, seguendo questa guida:

https://www.youtube.com/watch?v=B2KZ96ja9FA

Adesso devo capire come importare i miei dati nella datatable all'interno del report.. se qualcuno conosce questo strumento e sa darmi delle dritte, sempre pronto ad accettarle :)

Ultima modifica effettuata da aragorn76 il 18/06/2020 alle 18:49
PM Quote
Avatar
aragorn76 (Normal User)
Newbie


Messaggi: 17
Iscritto: 10/04/2014

Segnala al moderatore
Postato alle 17:19
Venerdì, 26/06/2020
OOkk.. ci siamo quasi.. ecco i passi per chi ha il mio stesso problema:

1. mi sono importato il crystalreport seguendo il video che ho linkato nel post precedente
2. messo nel mio form lo strumento CrystalReportViewer1
3. Aggiunto elemento report CrystalReport1.rpt che ho collegato al suddetto strumento
4. creati in questo elemento report dei "campi di parametro" e inseriti nel report (funzionano come le variabili)
5. Abbinati dei valori a queste variabili (nel report si chiamano primariga, secondariga, orario, data) in questo modo:

Codice sorgente - presumibilmente C# / VB.NET

  1. Dim report1 As New CrystalReport1  'creo il report
  2.    
  3. report1.SetParameterValue("primariga", "Esempio di testo")
  4. report1.SetParameterValue("secondariga", Label4.Text)
  5. report1.SetParameterValue("orario", "17.00")
  6. report1.SetParameterValue("data", "24/06/2020")
  7.  
  8. CrystalReportViewer1.ReportSource = report1


In questo modo ho inviato i miei valori al documento... che poi posso stampare....

Adesso inizia il codice a cui sto lavorando.. sperando che qualcuno mi possa aiutare, ecco cosa vorrei fare..
Ho il mio datagridview1 riempito con colonne DATATIME, UTENTE e TESTO

Nel documento bianco da stampare invece (che ho allegato come esempio) ho:
1. in alto ho le variabili "primariga" e "secondariga"
2. poi ho "data"
3. e poi ho "utente", "orario" e "testo"

vorrei che per ogni riga che legge dal DGV prende dalla colonna datetime la data e l'orario e li piazzi al loro posto.
Finche il giorno non cambia mette i vari record del dgv, se cambia il giorno, crea nuova pagina con data del nuovo giorno e continua con i record a seguire.....

sono arrivato al  

Codice sorgente - presumibilmente VB.NET

  1. For Each row In DataGridView1.Rows
  2.  
  3. Next



:hail:


aragorn76 ha allegato un file: report.jpg (132913 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da aragorn76 il 26/06/2020 alle 17:33
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 694
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:07
Sabato, 27/06/2020
Non capisco che problema hai. :rofl:
Metti troppa carne sul fuoco, togli tutto l'inutile.
I dati ce li hai, sia che sono sul database, o GridWiew, perché non riesci a stamparli?


in programmazione tutto è permesso
PM Quote
Avatar
aragorn76 (Normal User)
Newbie


Messaggi: 17
Iscritto: 10/04/2014

Segnala al moderatore
Postato alle 17:17
Lunedì, 29/06/2020
Ciao Carlooo...
Spero che conosci il crystal report..

Quindi ho il mio datagridview1 riempito e come hai notato anche il mio db.. solo che nel datagridview mi importo solo i valori che mi servono e per questo lavoro sulla dgv.. ho fatto questo ciclo:

Codice sorgente - presumibilmente C# / VB.NET

  1. For Each row In DataGridView1.Rows
  2.  
  3.                        'valori statici che non cambiano e non sono presi dalla dgv
  4.                         report1.SetParameterValue("primariga", "Società.....")
  5.                         report1.SetParameterValue("secondariga", "via....")
  6.                         report1.SetParameterValue("terzariga", "codice fiscale.....")
  7.                         report1.SetParameterValue("servizio", Label4.Text)
  8.                         report1.SetParameterValue("procedimento", Label3.Text)
  9.  
  10.                         'valori presi dalla dgv
  11.                         report1.SetParameterValue("data", row.Cells(0).Value.ToString("dd/MM/yyyy"))
  12.                         report1.SetParameterValue("orario", row.Cells(0).Value.ToString("HH:mm:ss"))
  13.                         report1.SetParameterValue("utente", row.Cells(1).Value.ToString)
  14.                      
  15.                         report1.SetParameterValue("testo", row.Cells(2).Value.ToString)
  16.                     Next



intanto ho un errore nel primo valore.... cioè row.Cells(0).Value.ToString() che è la data di tipo datetime.
se faccio:
Codice sorgente - presumibilmente Plain Text

  1. msgbox(row.Cells(0).Value.ToString())


ottengo "03/01/2020 12:47:15"  ma ho errore nelle due righe:
Codice sorgente - presumibilmente Plain Text

  1. report1.SetParameterValue("data", row.Cells(0).Value.ToString("dd/MM/yyyy"))
  2.  report1.SetParameterValue("orario", row.Cells(0).Value.ToString("HH:mm:ss"))

  
per il resto mi prende tutti i valori delle righe ma invece di averli sul documento e quindi avere 5 pagine, ottengo sul documento solo valori dell'ultima riga e quindi rimango a pagina 1

come faccio a dire che per ogni riga della dgv deve mettere nel foglio, aggiungere una riga vuota e inserire seconda riga ecc??? :_doubt:

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo