DotNetCampania
Il primo portale campano dedicato allo sviluppo software con tecnologie Microsoft

Stampare senza report

rated by 0 users
This post has 9 Replies | 2 Followers

Top 10 Partecipanti
Maschio
Post 87
Punteggio 1.295
Nezumi Posted: 21 lug 2009 15:21

Come da oggetto...la domanda è: Come si fa a mandare una stampa senza utilizzare i report???

Top 10 Partecipanti
Maschio
Post 383
Punteggio 5.595

Banalmente senza aprire il report! Prima di tutto: Crystal Report o Data Report?

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 87
Punteggio 1.295

mi è stato chiesto di utilizzare l'oggetto print di .net Tongue Tied

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 383
Punteggio 5.595

ma cosa devi stamapre? i contenuto di  un form o un report?

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 87
Punteggio 1.295

devo stampare quello che attualmente è il contenuto di un datagridview

 

mi è stato detto di usare l'oggetto print di .net ma credo si riferissero all'oggetto PrintDocument

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 383
Punteggio 5.595

Concordo sul PrintDocument, ecco un esempio:

http://www.codeproject.com/KB/printing/simpleprintingcs.aspx

Anche se penso che hai poche possibilità di formattazione del risultato...

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 87
Punteggio 1.295

non è che sia chiarissimo questo esempio...nel senso che : ho provato il codice...ma non compila nemmeno xD

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 383
Punteggio 5.595

Puoi banalmente leggere la documentazione ufficiale:

http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.print.aspx

 

  • | Punteggio Post: 20
Top 25 Partecipanti
Maschio
Post 16
Punteggio 190

Se hai ancora bisogno , posso darti una mano , lo ho utilizzato molte volte nelle mie applicazioni.

Andrea Romeo

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 87
Punteggio 1.295

no anzi ti ringrazio ho risolto ed inserisco i punti chiave della soluzione che ho adottato così da aiutare qualcuno con lo stesso problema e magari avere consigli su possibili soluzioni migliori:

.....

.....

using System.Drawing.Printing;

a livello di classe

        private int numPage = 1;
        private int numRow = 0;

 

nell'evento click del button che lancia la stampa

  1. PrintDocument printDoc = new PrintDocument();
  2. printDoc.PrintPage += new PrintPageEventHandler (this.printDoc_PrintPage);
  3. PrintDialog dlg = new PrintDialog();
  4. dlg.Document = printDoc;
  5. if (dlg.ShowDialog() == DialogResult.OK)
  6.      printDoc.Print();

 

  1. instanzio e inizializzo l'oggetto della classe PrintDocument
  2. associo all'evento "PrintPage" dell'oggetto printDoc il metodo (Che vedremo più sotto) this.printDoc_PrintPage
  3. instanzio e inizializzo l'oggetto della classe PrintDialog (il dialog per la scelta della stampante e le opzioni di stampa)
  4. Assegno alla proprietà Document del PrintDialog appena creato il PrintDocument
  5. controllo che il DialogResult della finestra per le opzioni sia OK
  6. avvio la stampa del documento (a questo punto scatta l'evento PrintPage)

private void printDoc_PrintPage(object sender, PrintPageEventArgs ev)
        {
            Font printFont = new Font("Times new roman", 9);
            Font titleFont = new Font("Times new roman", 20);
            float linesPerPage = 0;
            float yPos = 0;
            int count = 0;
            //recupero margine sinistro e alto del documento
            float leftMargin = ev.MarginBounds.Left;
            float topMargin = ev.MarginBounds.Top;
                    

            //calcola il numero di righe per pagina
            linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics);
           
            //Controllo se è la prima riga del documento che stampo in modo da scriverci un titolo
            if (numRow == 0)
            {
                ev.Graphics.DrawString("Elenco Clienti", titleFont, Brushes.Black, leftMargin, yPos, new StringFormat ());
            }

            //stampa tutte le righe del datagridview
            while ((count < linesPerPage) && (numRow < DataGridView.Rows.Count))
            {
                //controllo se è la prima riga della pagina in modo da avere gli header delle colonne ripetuti per ogni pagina
                if (count == 0)
                {
                    yPos = topMargin + (count * printFont.GetHeight(ev.Graphics));
                    ev.Graphics.DrawString("cella 1", printFont, Brushes.Black, leftMargin, yPos, new StringFormat());
                    ev.Graphics.DrawString("cella 2", printFont, Brushes.Black, leftMargin + 80, yPos, new StringFormat());
                    ev.Graphics.DrawString("cella 3", printFont, Brushes.Black, leftMargin + 140, yPos, new StringFormat());
                    ev.Graphics.DrawString("cella 4", printFont, Brushes.Black, leftMargin + 160, yPos, new StringFormat());
                    ev.Graphics.DrawString("cella 5",printFont, Brushes.Black, leftMargin + 285, yPos, new StringFormat());
                    ev.Graphics.DrawString("cella 6", printFont, Brushes.Black, leftMargin + 575, yPos, new StringFormat());
                }
                yPos = topMargin + ((count+1) * printFont.GetHeight(ev.Graphics));
                numRow++;
                DataGridViewRow riga = clientiDataGridView1.Rows[numRow-1*numPage];
                ev.Graphics.DrawString(riga.Cells[0].Value.ToString(), printFont, Brushes.Black, leftMargin, yPos, new StringFormat());
                ev.Graphics.DrawString(riga.Cells[1].Value.ToString(), printFont, Brushes.Black, leftMargin + 80, yPos, new StringFormat());
                ev.Graphics.DrawString(riga.Cells[2].Value.ToString(), printFont, Brushes.Black, leftMargin + 140, yPos, new StringFormat());
                ev.Graphics.DrawString(riga.Cells[3].Value.ToString(), printFont, Brushes.Black, leftMargin + 160, yPos, new StringFormat());
                ev.Graphics.DrawString(riga.Cells[4].Value.ToString(), printFont, Brushes.Black, leftMargin + 285, yPos, new StringFormat());
                ev.Graphics.DrawString(riga.Cells[5].Value.ToString(), printFont, Brushes.Black, leftMargin + 575, yPos, new StringFormat());               
                count++;
            }

            if (numRow < clientiDataGridView1.Rows.Count)
            {
                ev.HasMorePages = true;
                numPage++;
            }
            else
            {
                numPage = 1;
                numRow = 0;
                ev.HasMorePages = false;
            }
        }

 

Il codice così scritto stampa in sequenza come se fosse una tabella tutti i campi che volete del datagridview

penso si potesse astrarre ancora,anzi sicuramente lo si può fare, ma avevo poco tempo per trovare una soluzione ed anche se questa sembra sporca Big Smile funziona Wink

 

  • | Punteggio Post: 5
Pagina 1 di 1 (10 elementi) | RSS

Associazione Culturale DotNetCampania - C.F.: 95127870632

Powered by Community Server (Commercial Edition), by Telligent Systems