Stampe con PrintDialog1

venerdì 17 giugno 2011 - 15.43
Tag Elenco Tags  VB.NET  |  Windows 7  |  Visual Studio 2008  |  Access (.mdb)

Mau67 Profilo | Expert

Ciao al forum,
dopo svariate ricerche sul web sono riuscito a costruirmi il codice per la stampa dei dati del mio progetto utilizzando il PrintDialog1, fin qui tutto bene, adesso ho la necessità di visualizzare nel mio report i dati raggruppati per sede come nell'esempio allegato

Pe le mie stampe uso il seguente codice:

' lancio la stampa
Private Sub StampaAllegato12() ' report allegato 12


If Not File.Exists(FILE_NAME) Then
MsgBox(FILE_NAME & " Stringa di connessione mancante.")
Return
End If
Dim sr As StreamReader = File.OpenText(FILE_NAME)
Dim sqlString As String
sqlString = sr.ReadLine()
sr.Close()
Dim Connection As New OleDbConnection(sqlString)
Dim Command As New OleDbCommand
Dim adapter As New OleDbDataAdapter



Dim Sql = "SELECT Servizi.ID, Servizi.Dal, Servizi.Al, Reparti.Reparto + ' ' + Reparti.Città AS Reparto," & _
"Servizi.Anu, Servizi.Mnu, Servizi.Gnu, Servizi.Aca, Servizi.Mca, Servizi.Gca, Servizi.Asu, Servizi.Msu," & _
"Servizi.Gsu, Servizi.Ata, Servizi.Mta, Servizi.Gta, Servizi.Apa, Servizi.Mpa, Servizi.Gpa, Servizi.Afa," & _
"Servizi.Mfa, Servizi.Gfa, Servizi.IDReparto, Servizi.IDAnagrafica FROM Servizi INNER JOIN Reparti ON Servizi.IDReparto = Reparti.ID WHERE Servizi.IDAnagrafica = '" & m_ParametroCodiceFiscale & "' ORDER BY Servizi.Al"

Connection.Open()
Command = New OleDbCommand(Sql, Connection)
adapter.SelectCommand = Command
adapter.Fill(Ds, "Servizi")
bds = New BindingSource
bds.DataSource = Ds
bds.DataMember = "Servizi"
adapter.Dispose()
Command.Dispose()
Connection.Close()



If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then ' se nella finestra di dialogo si preme ok
PrintPreviewDialog1.Document = PrintDocument1 ' si passa il contenuto di PrintDocument a PrintPreviewDialog
PrintPreviewDialog1.ShowDialog() ' che lo visualizzerà

Else ' altrimenti

Exit Sub ' esco dalla sub

End If

End Sub

' il foglio che voglio stampare
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

' Dichiarazioni generali
Dim font1 As New Font("TimeRomanNew", 14, FontStyle.Bold)
Dim font2 As New Font("TimeRomanNew", 12, FontStyle.Bold)
Dim font3 As New Font("TimeRomanNew", 9, FontStyle.Bold)
Dim font4 As New Font("TimeRomanNew", 9)
Static i As Integer ' questa variabile contiene la posizione del dataset
Dim y As Integer = 340 ' in questa invece metto la posizione di stampa
' della prima rigadei dati. ATTENZIONE questa variabile non deve essere statica,
' altrimenti i dati vengono progressivamente stampati più in basso. Fino a uscire dal foglio
Dim str As String ' in questa variabile inserisco il valore della cella del dataset
Static Pagina As Integer ' in questa registro il numero della pagina corrente
Dim Parziale As Integer ' serve per calcolare il valore per pagina
Static Incrementale As Integer ' calcolo il valore delle pagine finora raggiunte
Static Totale As Integer ' totale definitivo

'***********************************************************************************************
'INTESTAZIONE DEL DOCUMENTO
e.Graphics.DrawImage(Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "ICO\LOGO REPUBBLICA.jpg"), 50, 50, 100, 100) ' se voglio inserire un immagine
e.Graphics.DrawString("DITTA", font1, Brushes.Black, 150, 50) ' se vogio inserire una riga di testo
e.Graphics.DrawString("Allegato 12 legge................", font2, Brushes.Black, 50, 250) ' legge allegato 12
'voci intestazione colonna
e.Graphics.DrawString("DAL", font3, Brushes.Black, 50, 300)
e.Graphics.DrawString("AL", font3, Brushes.Black, 150, 300)
e.Graphics.DrawString("SEDE", font3, Brushes.Black, 400, 300)
e.Graphics.DrawString("ANNI", font3, Brushes.Black, 930, 250)
e.Graphics.DrawString("ANNI N.U.", font3, Brushes.Black, 930, 300)

'************************************************************************************************

' CORPO DEL DOCUMENTO N.B. non coincide con la linea di divisione dell'intestazione!
For i = i To i + 24 ' record inserire in ogni pagina (in questo caso 25 ogniuna)
If i < bds.Count Then
str = Ds.Tables("Servizi").Rows(i).Item(1) ' prendo il valore della cella
e.Graphics.DrawString((str.PadLeft(5, ChrW(Len(str)))), font4, Brushes.Black, 50, y) ' e la posiziono sul foglio
str = Ds.Tables("Servizi").Rows(i).Item(2) ' prendo il valore della cella
e.Graphics.DrawString((str.PadLeft(5, ChrW(Len(str)))), font4, Brushes.Black, 150, y) ' e la posiziono sul foglio
str = Ds.Tables("Servizi").Rows(i).Item(3) ' prendo il valore della cella
e.Graphics.DrawString((str.PadLeft(5, ChrW(Len(str)))), font4, Brushes.Black, 250, y) ' e la posiziono sul foglio
str = Ds.Tables("Servizi").Rows(i).Item(4) ' prendo il valore della cella
e.Graphics.DrawString((str.PadLeft(5, ChrW(Len(str)))), font4, Brushes.Black, 900, y) ' e la posiziono sul foglio

y = y + font4.GetHeight ' incremento il valore di Y in modo da stampare la riga seguente sotto la precedente
e.HasMorePages = True ' permetto di stampare la pagina successiva
Else
e.HasMorePages = False ' blocco la stampa

End If
Next i

If i > bds.Count Then ' quando supera il numero di record da stampare (vuol dire che questi sono finiti). allora stampo il totale
e.Graphics.DrawLine(Pens.Black, 650, (y + 10), 720, (y + 10)) ' tiro la linea di somma
e.Graphics.DrawString("TOTALI", font3, Brushes.Black, 580, (y + 20)) 'La scritta totali
Totale = Totale + Incrementale ' calcolo il valore
e.Graphics.DrawString(Totale, font3, Brushes.Black, 650, (y + 20)) ' e lo stampo
End If

' ********************************************************************************************************

' PIE DI PAGINA DEL DOCUMENTO
e.Graphics.DrawLine(Pens.Blue, 50, 830, 750, 830) ' per visualizzare un elemento grafico
Pagina += 1 ' incremento il numero di pagina
e.Graphics.DrawString("Pagina" & Pagina, font2, Brushes.Black, 600, 850)

End Sub

Come faccio a creare stampe come per sede di servizio?

Grazie in anticipo
Mau67

freeteo Profilo | Guru

Ciao,
il fatto è che devi fare tutto a codice se usi un oggetto PrintiDocument...ma perchè non pensi di includere un report? Perchè ci sono strumenti nati appositamente per queste cose, che ti semplificano notevolmente la vita
Magari includi quelli di SqlReporting (ReportViewer => http://www.gotreportviewer.com) invece di Crystal che è più pesante...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Mau67 Profilo | Expert

Ok ma se voglio che in ogni pagina mi inserisca un certo numero di righe? come faccio?

Vedi un report fattura dove magari gli articoli sono 100 e io ne voglio inserire 25 per pagina.

Grazie
Mau67

freeteo Profilo | Guru

Ciao,
guarda qui: http://msdn.microsoft.com/en-us/library/ms251668(VS.80).aspx in particolare nella sezione "Page Breaks", fa proprio un esempio di questo tipo.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Mau67 Profilo | Expert

Ok grazie prverò ad usare questo tipo di report.

Grazie alla prossima
Mau67
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5