C # Anteprima della finestra di dialogo Stampa

Dispongo di un datagrid di informazioni e quando si fa clic sul pulsante di stampa, voglio mostrare una schermata di anteprima di stampa di come sarà e quindi lasciare che l’utente stampi il documento. Ecco cosa ho ottenuto finora:

PrintDocument myDocument = new PrintDocument(); PrintPreviewDialog PrintPreviewDialog1 = new PrintPreviewDialog(); PrintPreviewDialog1.Document = myDocument; PrintPreviewDialog1.ShowDialog(); 

La mia domanda è come ottenere i dati sullo schermo di anteprima .. grazie!

È necessario aggiungere l’evento PrintPage :

 myDocument.DocumentName = "Test2015"; myDocument.PrintPage += myDocument_PrintPage; 

e devi codificarlo! Nella sua forma più semplice, questo farà uscire i dati:

 void myDocument_PrintPage(object sender, PrintPageEventArgs e) { foreach(DataGridViewRow row in dataGridView1.Rows) foreach(DataGridViewCell cell in row.Cells) { if (Cell.Value != null) e.Graphics.DrawString(cell.Value.ToString(), Font, Brushes.Black, new Point(cell.ColumnIndex * 123, cell.RowIndex * 12 ) ); } } 

Ma ovviamente vorrete aggiungere molto altro per ottenere una bella formattazione, ecc.

  • Ad esempio, è ansible utilizzare il metodo Graphics.MeasureString() per individuare le dimensioni di un blocco di testo per ottimizzare i coodati, che sono codificati solo per il test qui.

  • È ansible utilizzare la cell.FormattedValue anziché il Value cell.FormattedValue .

  • Potresti voler preparare alcuni tipi di Fonts che utilizzerai, aggiungere il prefisso al dgv con un’intestazione, magari un logo ..

Vale anche la pena considerare l’impostazione Unit come dispositivo indipendente come mm :

 e.Graphics.PageUnit = GraphicsUnit.Millimeter; 

E, se necessario, dovresti tenere traccia delle posizioni verticali in modo da poter aggiungere numeri di pagina e riconoscere quando una pagina è piena!

Aggiornamento: poiché il tuo DGV può contenere celle vuote, ho aggiunto un controllo per null .