Oppure

Loading
16/06/20 10:56
aragorn76
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:

Private Sub PrintDocument1_PrintPage(sender As Object, e As Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

        Dim fon As New Font("Time New Roman", 14)
        Dim primariga As String = "esempio prima riga"
        Dim secondariga As String = "esempio seconda riga"
        Dim terzariga As String = "esempio terza riga"
        Dim numpag As Integer
        Dim logo As Drawing.Image = My.Resources.replogo


        'logo e intestazione
        e.Graphics.DrawImage(logo, 350, 30, 100, 100)
        e.Graphics.DrawString(primariga, fon, Brushes.Black, 250, 150)
        e.Graphics.DrawString(secondariga, fon, Brushes.Black, 280, 170)
        e.Graphics.DrawString(terzariga, fon, Brushes.Black, 270, 190)

        'nr pagina
        e.Graphics.DrawString("Pagina nr. " & numpag, fon, Brushes.Blue, 650, 220)

        'titolo cella
        e.Graphics.DrawString("Utente         Orario          Descrizione", New Font("Time New Roman", 12), Brushes.Blue, 50, 370)

        'valori datagridview
       
      ' -> Qui il problema <- 


        'firma
        e.Graphics.DrawString("L'Operatore                                                            L'Ufficiale di P.G.", fon, Brushes.Blue, 80, 1000)

    End Sub


 Private Sub stampa_Click(sender As Object, e As EventArgs) Handles stampa.Click
        PrintDialog1.Document = PrintDocument1
        If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.Yes Then
            PrintDocument1.Print()
        End If
    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:
Ultima modifica effettuata da aragorn76 26/06/20 14:20
aaa
16/06/20 23:48
Henry 128
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.
aaa
17/06/20 13:11
Carlo
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.
support.microsoft.com/it-it/help/316383/…

L'unica scorciatoia che potresti perseguire è stampare il Form così come è visualizzato.
docs.microsoft.com/it-it/dotnet/framework/winforms/advanced/…
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 17/06/20 14:43
in programmazione tutto è permesso
17/06/20 14:54
aragorn76
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..

aaa
17/06/20 19:10
Carlo
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: pierotofy.it/pages/sorgenti/dettagli/19605-ExcelToPdf/
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 18/06/20 8:30
in programmazione tutto è permesso
18/06/20 10:49
aragorn76
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:

youtube.com/…

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 18/06/20 16:49
aaa
26/06/20 15:19
aragorn76
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:

Dim report1 As New CrystalReport1  'creo il report
   
report1.SetParameterValue("primariga", "Esempio di testo")
report1.SetParameterValue("secondariga", Label4.Text)
report1.SetParameterValue("orario", "17.00")
report1.SetParameterValue("data", "24/06/2020")

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

For Each row In DataGridView1.Rows

Next


:hail:
Ultima modifica effettuata da aragorn76 26/06/20 15:33
aaa
27/06/20 14:07
Carlo
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