martedì 31 maggio 2011

stampare un controllo DatagridView .Net 4

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_stampa-di-un-controllo-datagridview-vbne_1050.aspx







Introduzione.




Con quest’articolo si conclude la serie dedica alla gestione della stampa tramite la tecnologia .Net 4.
In quest’ultima parte vedremo come stampare un controllo datagridview tramite il linguaggio di programmazione Visual Basic Net 2010.
Dopo aver creato un nuovo progetto di tipo Windows Application, per il liguaggio Visual Basic, aggiungiamo nella form, tre pulsanti,un controllo datagridview, un controllo printdocument, printDialog, e printPreviewdialog, il tutto come mostrato in figura 1.







Figura 1







Stesura di codice




Ora passiamo in visualizzazione codice, si deve creare una classe (da esplora soluzione, tasto destro sul nome del progetto, nuova classe) che avrà il compito di gestire il controllo datagridView e la relativa stampa.
Qui di seguito si riporta il codice completo di tale classe.




Imports System.Drawing.Printing







Public Class StampaDatagrid







Private PrdPrintDocument As PrintDocument




Private dttTAbella As DataTable




Private dtgDatagrid As DataGridView







Public intContaRighe As Integer = 0




Private Const CintLineaVerticale As Integer = 10




Public IntNumeroPagina As Integer = 1




Public Arrlinee As ArrayList = New ArrayList()







Public intLarghezza As Integer




Public intAltezza As Integer




Public intMargineSuperiore As Integer




Public intMargineInferiore As Integer







'costruttore della classe




Public Sub New(ByVal dtgDatagridCostruttore As DataGridView, ByVal prdPrintDocumentCostruttore As PrintDocument, ByVal DttTAbleCostruttore As DataTable)




'imposto i parametri dell'anteprima di stampa




PrdPrintDocument = prdPrintDocumentCostruttore




dttTAbella = DttTAbleCostruttore




dtgDatagrid = dtgDatagridCostruttore




intLarghezza = PrdPrintDocument.DefaultPageSettings.PaperSize.Width




intAltezza = PrdPrintDocument.DefaultPageSettings.PaperSize.Height




intMargineSuperiore = PrdPrintDocument.DefaultPageSettings.Margins.Top




intMargineInferiore = PrdPrintDocument.DefaultPageSettings.Margins.Bottom




End Sub







'funzione per il disegno dell'intestazione




Public Sub DisegnaIntestazione(ByVal g As Graphics)




Dim ForeBrush As SolidBrush = New SolidBrush(dtgDatagrid.ColumnHeadersDefaultCellStyle.ForeColor)




Dim BackBrush As SolidBrush = New SolidBrush(dtgDatagrid.ColumnHeadersDefaultCellStyle.BackColor)




Dim TheLinePen As Pen = New Pen(dtgDatagrid.GridColor, 1)




Dim FormatoCella As StringFormat = New StringFormat()




FormatoCella.Trimming = StringTrimming.EllipsisCharacter




FormatoCella.FormatFlags = StringFormatFlags.NoWrap Or StringFormatFlags.LineLimit













Dim intLarghezzaColonna As Integer = intLarghezza / dttTAbella.Columns.Count







Dim IntInizioContaRighe As Integer = intContaRighe







'Disegno l'intestazione




Dim IntXposizione As Single = dtgDatagrid.Location.X




Dim nextcellbounds As RectangleF = New RectangleF(0, 0, 0, 0)







Dim HeaderBounds As RectangleF = New RectangleF(0, 0, 0, 0)







HeaderBounds.X = dtgDatagrid.Location.X




HeaderBounds.Y = dtgDatagrid.Location.Y + intMargineSuperiore + (intContaRighe - IntInizioContaRighe) * (dtgDatagrid.Font.SizeInPoints + CintLineaVerticale)




HeaderBounds.Height = dtgDatagrid.Font.SizeInPoints + CintLineaVerticale




HeaderBounds.Width = intLarghezza







g.FillRectangle(BackBrush, HeaderBounds)







Dim k As Integer




For k = 0 To dttTAbella.Columns.Count - 1 Step k + 1




Dim nextcolumn As String = dttTAbella.Columns(k).ToString()




Dim cellbounds As RectangleF = New RectangleF(IntXposizione, dtgDatagrid.Location.Y + intMargineSuperiore + (intContaRighe - IntInizioContaRighe) * (dtgDatagrid.Font.SizeInPoints + CintLineaVerticale), intLarghezzaColonna, dtgDatagrid.ColumnHeadersDefaultCellStyle.Font.SizeInPoints + CintLineaVerticale)




nextcellbounds = cellbounds










g.DrawString(nextcolumn, dtgDatagrid.ColumnHeadersDefaultCellStyle.Font, ForeBrush, cellbounds, FormatoCella)










IntXposizione = IntXposizione + intLarghezzaColonna







Next







If dtgDatagrid.CellBorderStyle <> DataGridViewCellBorderStyle.None Then




g.DrawLine(TheLinePen, dtgDatagrid.Location.X, nextcellbounds.Bottom, intLarghezza, nextcellbounds.Bottom)




End If




End Sub







'funzione per disegnare le righe




Public Function DisegnaRighe(ByVal g As Graphics) As Boolean




Dim IntRigaSuperiore As Integer = intMargineSuperiore




Try




Dim ForeBrush As SolidBrush = New SolidBrush(dtgDatagrid.ForeColor)




Dim BackBrush As SolidBrush = New SolidBrush(dtgDatagrid.BackColor)




Dim AlternatingBackBrush As SolidBrush = New SolidBrush(dtgDatagrid.AlternatingRowsDefaultCellStyle.BackColor)




Dim TheLinePen As Pen = New Pen(dtgDatagrid.GridColor, 1)




Dim FormatoCella As StringFormat = New StringFormat()




FormatoCella.Trimming = StringTrimming.EllipsisCharacter




FormatoCella.FormatFlags = StringFormatFlags.NoWrap / StringFormatFlags.LineLimit




Dim IntLargehzzaColonna As Integer = intLarghezza / dttTAbella.Columns.Count







Dim IntInizioContaRighe As Integer = intContaRighe







Dim RowBounds As RectangleF = New RectangleF(0, 0, 0, 0)










'disegno la griglia




Dim i As Integer




For i = IntInizioContaRighe To dttTAbella.Rows.Count - 1 Step i + 1




Dim dr As DataRow = dttTAbella.Rows(i)




Dim startxposition As Integer = dtgDatagrid.Location.X







RowBounds.X = dtgDatagrid.Location.X




RowBounds.Y = dtgDatagrid.Location.Y + intMargineSuperiore + ((intContaRighe - IntInizioContaRighe) + 1) * (dtgDatagrid.Font.SizeInPoints + CintLineaVerticale)




RowBounds.Height = dtgDatagrid.Font.SizeInPoints + CintLineaVerticale




RowBounds.Width = intLarghezza




Arrlinee.Add(RowBounds.Bottom)







If i Mod 2 = 0 Then




g.FillRectangle(BackBrush, RowBounds)




Else




g.FillRectangle(AlternatingBackBrush, RowBounds)




End If










Dim j As Integer




For j = 0 To dttTAbella.Columns.Count - 1




Dim cellbounds As RectangleF = New RectangleF(startxposition, dtgDatagrid.Location.Y + intMargineSuperiore + ((intContaRighe - IntInizioContaRighe) + 1) * (dtgDatagrid.Font.SizeInPoints + CintLineaVerticale), IntLargehzzaColonna, dtgDatagrid.Font.SizeInPoints + CintLineaVerticale)










g.DrawString(dr(j).ToString(), dtgDatagrid.Font, ForeBrush, cellbounds, FormatoCella)




IntRigaSuperiore = CType(cellbounds.Bottom, Integer)










startxposition = startxposition + IntLargehzzaColonna




Next







intContaRighe = intContaRighe + 1







If intContaRighe * (dtgDatagrid.Font.SizeInPoints + CintLineaVerticale) > (intAltezza * IntNumeroPagina) - (intMargineInferiore + intMargineSuperiore) Then




DisegnaLineaOrizzontale(g, Arrlinee)




DisegnaLineaVerticale(g, TheLinePen, intLarghezza, IntRigaSuperiore)




Return True




End If










Next







DisegnaLineaOrizzontale(g, Arrlinee)




DisegnaLineaVerticale(g, TheLinePen, IntLargehzzaColonna, IntRigaSuperiore)




Return False







Catch ex As Exception




MessageBox.Show(ex.Message.ToString())




Return False




End Try










End Function




'funzione per disegnare la linea orizzontale




Private Sub DisegnaLineaOrizzontale(ByVal g As Graphics, ByVal arlLinee As ArrayList)




Dim PenDisegnaLinea As Pen = New Pen(dtgDatagrid.GridColor, 1)




If dtgDatagrid.CellBorderStyle = DataGridViewCellBorderStyle.None Then




Return




End If




Dim IntConta As Integer




For IntConta = 0 To arlLinee.Count - 1 Step IntConta + 1




g.DrawLine(PenDisegnaLinea, dtgDatagrid.Location.X, arlLinee(IntConta), intLarghezza, arlLinee(IntConta))




Next




End Sub







'funzione per disegnare la linea verticale




Private Sub DisegnaLineaVerticale(ByVal g As Graphics, ByVal penLinea As Pen, ByVal intLarghezzaColonna As Integer, ByVal intInferiore As Integer)




If dtgDatagrid.CellBorderStyle = DataGridViewCellBorderStyle.None Then




Return




End If







Dim intConta As Integer




For intConta = 0 To dttTAbella.Columns.Count - 1 Step intConta + 1




g.DrawLine(penLinea, dtgDatagrid.Location.X + intConta * intLarghezzaColonna, dtgDatagrid.Location.Y + intMargineSuperiore, dtgDatagrid.Location.X + intConta * intLarghezzaColonna, intInferiore)




Next




End Sub







'funzione per disegnare un GridView




Public Function DisegnaDatagridView(ByVal g As Graphics) As Boolean




Try




DisegnaIntestazione(g)




Dim blnContinua As Boolean = DisegnaRighe(g)




Return blnContinua




Catch ex As Exception




MessageBox.Show(ex.Message)




Return False




End Try







End Function













End Class




Terminato ciò, passiamo in visualizzazione codice della form.
Scriviamo una variabile a livello di classe, dopo la dichiarazione di form, scriviamo un oggetto di tipo della classe precedentemente creata.
Qui di seguito si riporta tale esempio




Private stampaGriglia As StampaDatagrid




A questo punto, dobbiamo creare una funzione che permetta il caricamento dei dati del controllo datagridview e che inizializzi l’oggetto della classe StampaDatagrid.
Qui di seguito riportiamo il frammento di codice di tali operazioni.






Private Sub CaricaGriglia()




Dim dttDati As New DataTable()




Dim dtcNome As New DataColumn("Nome")




Dim dtcCognome As New DataColumn("Cognome")




dttDati.Columns.Add(dtcCognome)




dttDati.Columns.Add(dtcNome)




Dim dtrRiga As DataRow




dtrRiga = dttDati.NewRow()




dtrRiga("Nome") = "Emanuele"




dtrRiga("Cognome") = "Mattei"




dttDati.Rows.Add(dtrRiga)







dtrRiga = dttDati.NewRow()




dtrRiga("Nome") = "Emanuele2"




dtrRiga("Cognome") = "Mattei2"




dttDati.Rows.Add(dtrRiga)







dtrRiga = dttDati.NewRow()




dtrRiga("Nome") = "Emanuele3"




dtrRiga("Cognome") = "Mattei3"




dttDati.Rows.Add(dtrRiga)







dgvDati.DataSource = dttDati




stampaGriglia = New StampaDatagrid(dgvDati, PrintDocument1, dttDati)







End Sub







Dopo il caricamento della griglia, si inizializza l’oggetto di tipo StampaDatagrid, impostando i parametri del costruttore con il controllo griglia, il controllo di tipo printdocument e l’oggetto di tipo datatable contenente i dati.
Questa funzione, viene richiamata dall’evento load della form, come riportato qui di seguito.






Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load




CaricaGriglia()




End Sub







Scriviamo il codice, riguardante l’evento printpage, in cui si utilizzerà il metodo DisegnaDataGridView, per impostare l’area di
stampa.






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




Dim g As Graphics = e.Graphics










Dim more As Boolean = stampaGriglia.DisegnaDatagridView(g)







End Sub







Ora non resta che scrivere il codice , riguardante il controllo PrintPreviewDialog, qui di seguito si riporta il frammento di codice.






Private Sub PrintPreviewDialog1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PrintPreviewDialog1.Load




PrintPreviewDialog1.Bounds = ClientRectangle




End Sub







Siamo giunti quasi alla fine della stesura di codice, dobbiamo impostare gli eventi click del pulsante anteprima e stampa.
Nel primo caso utilizziamo il controllo printprewiewdialog, mentre nel secondo caso il controllo printdocument.
Si riporta il frammento di codice di tali operazioni.
Per il pulsante di anteprima, qui di seguito il codice dell’evento click






Private Sub BtnAnteprima_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAnteprima.Click




stampaGriglia.IntNumeroPagina = 1




stampaGriglia.intContaRighe = 0




If Me.PrintPreviewDialog1.ShowDialog() = DialogResult.OK Then




End If







Mentre qui di seguito, si riporta il codice, riguardante l’evento click del pulsante di stampa.






Private Sub BtnStampa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStampa.Click




stampaGriglia.IntNumeroPagina = 1




stampaGriglia.intContaRighe = 0




If PrintDialog1.ShowDialog() = DialogResult.OK Then




'non visualizza la popup




Me.PrintDocument1.PrintController = New System.Drawing.Printing.StandardPrintController()




PrintDocument1.Print()




End If




End Sub










Conclusione




In questa serie di articoli, il lettore avrà acquisito le conoscenze per la stampa in ambito delle Windows Application, tramite la tecnologia .Net 4. La stampa è un elemento fondamentale, nel caso si sviluppano applicazioni gestionali, come software per la contabilità, buste paga, ed altro ancora. Le tecniche per la stampa di un controllo Datagridview, sono diverse, in questa guida è stata illustrata una delle tante tecniche.




Tramite la parola download si può scaricare il file d’esempio utilizzato in questo articolo.






Download

lunedì 30 maggio 2011

software gratuito per negozianti

Al seguente sito http://www.logimond.com/software.php trovate una serie di software gratuiti.
Uno di questi, permette di gestire attività commerciali, come negozi o magazzini.
Il software, permette una valida gestione dei clienti, cassa, magazino e tanto altro.
Il software è in lingua italiana.
Per il download e maggiori informazoini, visitate il seito indicato.

domenica 29 maggio 2011

Inviare file di grandi dimensioni

Il seguente sito https://www.wetransfer.com/ offre un servizio gratuito.



In pratica la possibilità di inviare file di grandi dimensioni (max 2 gb), dopo aver digitato l'indirizzo email del destinario e mittente, tramite il pulsante trasferisci, verrà trasferito il file.



sabato 28 maggio 2011

Introduzione alla programmazione XNA 4



In questo articolo, viene fornita una breve introduzione alla creazione di video giochi, in particolare, vedremo la piattaforma gratuita XNA che permette la creazione di video giochi, un settore in continua crescita che affanina molte persone, e non solo giovani.
L'ambiente di sviluppo XNA game studio 4.0 scaricabile dal seguente sito http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9ac86eca-206f-4274-97f2-ef6c8b1f478f è un software, che tramite il linguaggio di programmazione C# permette la creazione di video giochi per ambiente Windows, Xbox, e Windows Phone 7, telefoni con prestazioni e componenti hardware molto avanzati.
Questo componente, si installa, solo nel caso, che abbiamo installato sul pc Visual Studio 2010, anche la versione express.
La guida in linea, è consultabile al seguente sito http://msdn.microsoft.com/it-it/library/bb200104.aspx mentre da diversi anni, la community Microsoft (visibile qui http://create.msdn.com/en-US/ ) è attiva con tutorial, video guide, esempi e demo di giochi, comprendenti sorgenti in C#.
Dopo aver installato Visual Studio 2010 (ricordiamo che la versione express è gratuita) scarichiamo dal sito Microsoft ed installiamo XNA, il nostro ambiente per lo sviluppo di video giochi.Terminata l'installazione, troveremo nel menu dei programmi, una nuova voce, con alcuni tools che ci possono tornare utile, durante lo sviluppo di video giochi.Se apriamo visul studio 2010, e selezioniamo la voce di menu file e successivamente new e poi project, troviamo la categoria XNA Game Studio come riportato in figura 1, il quale una volta selezionato, riporterà i vari modelli installati.




Figura 1


I primi due modelli riguardano lo sviluppo windows, in particolare la creazione di un gioco, oppure la creazione di una libreria, componente che aggiunge funzionalità riiutizzabili in più progetto.Mentre i successivi modelli, riguardano le stesse funzionalità, ossia creazione del gioco vero e proprio e dll, ma il tutto in ambiente xbox.Gli altri progetti, permettono di creare delle estenzioni, ossia integrazione di contenuti nei progetti.Noi vedremo il primo progetto, ossia la creazione di un video gioco.
A questo punto, selezioniamo Windows Game (4), verrà creato un progetto, con diverse classi. (Figura 2).










































Figura 2


La classe Game1, presente in ogni nuovo progetto, eredita dalla classe Microsoft.Xna.Framework.Game ed è quella che si occupa della gestione del gioco.
Inoltre troviamo, alcune immagini.
Molti programmatori windows application o asp.net, noteranno subito, che non c'è una parte visiva, ossia di disegno, come i programmatori per applicazioni windows e web sono abbituali.
Nessun controllo ed altro possiamo utilizzare a livello disegno.
Se facciamo click sul pulsante di esecuzione o facciamo f5, verrà eseguito il nostro gioco in ambito windows, con uno sfondo blu, ed una finestra, tipica delle windows application, il tutto come mostrato in figura 3.







Figura 3



Per modificare il colore di sfondo, nell'evento Draw della classe game1, cambiare l'enumeratore di colore, il frammento qui di seguito, imposta il colore griglio.


protected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.Green);

// TODO: Add your drawing code here

base.Draw(gameTime);

}



Se invece, vogliamo impostare la visibilità del cursore, visto che al passaggio nella form, viene nascosto, nel costruttore della classe, impostiamo la proprietà ismousevisible a true, mentre la proprietà title di windows, permette di rilevare o impostare il testo del titolo della finestra.Qui di seguito si riporta un frammento di codice.


protected override void Initialize()

{

// TODO: Add your initialization logic here

base.Initialize();

this.IsMouseVisible = true;

this.Window.Title = "Mio titolo";

}




Conclusioni.

L'articolo, ha voluto fornire una lieve introduzione al mondo Xna, un nuovo modo di fare gaming, senza nessun costo.Un ambiente, in cui permette di creare giochi per diversi ambiti, come windows, phone e xbox.


venerdì 27 maggio 2011

Segnalazione sito nextme

Per la rubrica, segnalazione sito, oggi vi segnalo Nextme, http://www.nextme.it/ un sito in italiano, di divulgazione scientifica.
Nel sito si trovano notizie, in ambito tecnologico, natura, ambiente e tanto altro.

giovedì 26 maggio 2011

segnalazione sito convert file

In questo sito http://www.fileminx.com/Default.aspx trovate un ottimo strumento gratuito, che permette di convertire i file, in determinati formati, come documenti, immagini, audio e video.
Il servizio è gratuito e non richiede nessuna registrazione o indirizzo email.
Al termine della conversione, ci verrà fornito a video, il link dove scaricare il file.
Che dirvi.. buona conversione

mercoledì 25 maggio 2011

Javascript value dropdownlistbox

In javascript, tramite il metodo GetElementById dell'oggetto document, possiamo rilevare il valore di un controllo dropdownlistbox.
Qui di seguito si riporta un esempio di codice

document.getElementById('DdlControllo').value;

martedì 24 maggio 2011

VB Net novità codice a capo

In VB.Net 10, ci sono notevoli novità, tra cui, la possibilità di scrivere il codice andando a capo senza più il carattere "_"





Si riporta un esempio di codice qui di seguito.









Private Sub miafunzione(ByVal par As String,





ByVal par2 As Int16,





ByVal par3 As String)













End Sub





lunedì 23 maggio 2011

Evento gratuito su ubuntu

Flavia, mi informa, di un ottimo evento gratuito su Ubuntu, per il mese di maggio.
Ubuntu Meeting, http://wiki.ubuntu-it.org/UbuntuItMeeting è un evento gratuito che si terrà il 28 maggio presso l'università La Sapienza, in cui si parlerà del nuovo sistema operativo e del mondo open source.

Qui http://wiki.ubuntu-it.org/UbuntuItMeeting/DoveQuando trovate il luogo dell'evento mentre qui http://wiki.ubuntu-it.org/UbuntuItMeeting/Programma il programma con le varie sessioni.



Riporto qui di seguito, il comunicato stampa.


Ubuntu-it Meeting 2011

Sabato 28 maggio presso la Facoltà di Ingegneria dell'Università degli
studi "La Sapienza" di Roma, via Eudossiana 18, si terrà per la prima volta a
Roma il meeting semestrale della Comunità Italiana di Ubuntu.
Organizzato in collaborazione con La Sapienza Linux User Group sarà un
momento di incontro tra i membri della comunità stessa e gli appassionati.
Accanto al dibattito interno alla comunità, alla presentazione del nuovo
sito che segue il nuovo brand e alla anticipazioni sulla futura Ubuntu 11.10,
la giornata affronterà temi che riguardano da vicino il mondo dell'open
source grazie anche alla presenza di personalità di spicco del mondo del
software libero come Renzo Davoli, Presidente di ASSOLI e professore
associato presso la facoltà di Informatica dell'Università di Bologna e Flavia
Marzano, Vice Presidente dell'Associazione italiana per l'Open Government
e docente di Sofware libero presso l'Università La Sapienza.
Il programma completo dell'evento è disponibile all'indirizzo:
http://wiki.ubuntu-it.org/UbuntuItMeeting
Per ulteriori informazioni è possibile contattare:
ufficiostampa@ubuntu-it.org o sapienzalug@gmail.com

domenica 22 maggio 2011

La stampa in .Net 4 tramite VB.Net e C#

Riporto l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_la-stampa-in-microsoft-net-4-vbnet-e-c_1048.aspx





Introduzione.



In questo articolo, vedremo l’utilizzo della stampa tramite la tecnologia .Net 4 ed i linguaggi Visual Basic Net e C#.
L’articolo vuole fornire al lettore le conoscenze di base ed in particolare sull’utilizzo della stampa in ambiente Windows Application, in particolare vedremo come stampare immagini e testo tramite .Net 4.



Primi passi



Create un nuovo progetto di tipo Windows Application, nel linguaggio di vostro gradimento.
Nella form, inserite un controllo di tipo picturebox, un richtextbox, quattro pulsanti ed un controllo label, il tutto come riportato in figura 1.








Figura 1





Il controllo Richtextbox, servirà per caricare il testo da un file di tipo “.rtf”.



Stesura di codice



Dopo aver impostato le varie proprietà ai controlli, passiamo in visualizzazione codice, per scrivere il codice per la gestione della stampa.
Per la stampa, occorre inserire lo spazio dei nomi “printing” il quale contiene le classi per poter effettuare e gestire le stampe.
Qui di seguito si riporta il frammento di codice di tale dichiarazione.



VB.Net



Imports System.Drawing.Printing





C#



using System.Drawing.Printing;







Terminato ciò, scriviamo una variabile a livello di classe form, per gestire la stampa nei vari eventi click dei pulsanti.
Oltre a ciò, scriviamo anche una constante per il titolo delle messagebox.
Il codice riportato qui di seguito, va inserito dopo la dichiarazione della form.






VB.Net



'creo una variabile per gestire i dcumenti di stampa



Private WithEvents pdocStampa As New PrintDocument()



'costante per il titolo delle messagebox



Const titolo As String = "Esempio Stampa"





C#



//costante per il titolo delle messagebox



const string titolo = "Esempio Stampa";



//creo una variabile per gestire i dcumenti di stampa



private PrintDocument pdocStampa = new PrintDocument();







Nell’evento load della form, carichiamo il testo presente in un file rtf




VB.Net



Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load



If (System.IO.File.Exists(Environment.CurrentDirectory & "\testo.rtf")) Then rtbTesto.LoadFile(Environment.CurrentDirectory & "\testo.rtf")



End Sub





C#



private void Form1_Load(object sender, EventArgs e)



{



//gestore di evento dell'oggetto printdocument, per gestire lìevento printpage



pdocStampa.PrintPage += new PrintPageEventHandler(pdocStampa_PrintPage);



if (System.IO.File.Exists(Environment.CurrentDirectory + "\\testo.rtf"))



rtbTesto.LoadFile(Environment.CurrentDirectory + "\\testo.rtf");



}





L’evento printpage, ci permette di gestire la stampa, questo evento viene richiamato sia per l’anteprima di stampa che per la stampa.
Riportiamo qui di seguito il frammento di codice di tale evento




VB.Net



Private Sub pdocStampa_printpage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pdocStampa.PrintPage



Dim ImgStampa As Image = pbxLogo.Image



'imposto il carattere per la stampa ed anteprima



Dim fntSTampa As New Font(Me.Font.FontFamily, 10, FontStyle.Regular)



'imposto altezza



Dim IntAltezza As Integer = e.MarginBounds.Top + 50



'imposto l'immagine



Dim RctImmagine As New Rectangle(e.MarginBounds.Left + 20, e.MarginBounds.Top - 30, 48, 48)





'ottengo il carattere corrente



Static IntCarattere As Integer





Dim intCaratteriInseriti As Integer = 0



Dim intLineeInserite As Integer = 0



Dim Fmt As New StringFormat(StringFormatFlags.LineLimit)





Try



'disegno l'immagine



e.Graphics.DrawImage(ImgStampa, RctImmagine)





Dim intPrintAreaHeight, intPrintAreaWidth, intmarginLeft, intmarginTop As Int32



'imposto le misure per la stampa



With pdocStampa.DefaultPageSettings



'imposto l'area di stampa



intPrintAreaHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom



intPrintAreaWidth = .PaperSize.Width - .Margins.Left - .Margins.Right





'imposto i margini



intmarginLeft = .Margins.Left ' X coordinate



intmarginTop = .Margins.Top + 30 ' Y coordinate



End With



'area di stampa



Dim RctAreaDiStampa As New RectangleF(intmarginLeft, intmarginTop, intPrintAreaWidth, intPrintAreaHeight)



'verifico che le stringa entri nell'area di stampa



e.Graphics.MeasureString(Mid(rtbTesto.Text, IntCarattere + 1), fntSTampa, _



New SizeF(intPrintAreaWidth, intPrintAreaHeight), Fmt, intCaratteriInseriti, intLineeInserite)



e.Graphics.DrawString(Mid(rtbTesto.Text, IntCarattere + 1), fntSTampa, _



Brushes.Black, RctAreaDiStampa, Fmt)



'conto il carattere che sto inserendo



IntCarattere += intCaratteriInseriti



'verifico se devo inerire una pagina aggiuntiva



If IntCarattere < rtbTesto.Text.Length Then



e.HasMorePages = True



Else



e.HasMorePages = False



'riporto a zero il contatore



IntCarattere = 0



End If



Catch ex As Exception



MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error)



End Try



End Sub





C#



private void pdocStampa_PrintPage(object sender, PrintPageEventArgs e)



{





Image ImgStampa = pbxLogo.Image;





//imposto il carattere per la stampa ed anteprima



Font fntSTampa = new Font(this.Font.FontFamily, 10, FontStyle.Regular);





//imposto altezza



int IntAltezza = e.MarginBounds.Top + 50;





//imposto le dimensione dell'immagine



Rectangle RctImmagine = new Rectangle(e.MarginBounds.Left + 20, e.MarginBounds.Top - 30, 48, 48);







//ottengo il carattere corrente



int IntCarattere = 0;





int intCaratteriInseriti = 0;



int intLineeInserite = 0;



StringFormat Fmt = new StringFormat(StringFormatFlags.LineLimit);



try



{



//disegno l'immagine



e.Graphics.DrawImage(ImgStampa, RctImmagine);





int intPrintAreaHeight, intPrintAreaWidth, intmarginLeft, intmarginTop;





//imposto le misure per la stampa



//imposto l'area di stampa



intPrintAreaHeight = pdocStampa.DefaultPageSettings.PaperSize.Height - pdocStampa.DefaultPageSettings.Margins.Top - pdocStampa.DefaultPageSettings.Margins.Bottom;



intPrintAreaWidth = pdocStampa.DefaultPageSettings.PaperSize.Width - pdocStampa.DefaultPageSettings.Margins.Left - pdocStampa.DefaultPageSettings.Margins.Right;





//imposto i margini



intmarginLeft = pdocStampa.DefaultPageSettings.Margins.Left; // X coordinate



intmarginTop = pdocStampa.DefaultPageSettings.Margins.Top + 30; // Y coordinate



//area di stampa



RectangleF RctAreaDiStampa = new RectangleF(intmarginLeft, intmarginTop, intPrintAreaWidth, intPrintAreaHeight);



//verifico che le stringa entri nell'area di stampa



e.Graphics.MeasureString(rtbTesto.Text, fntSTampa, new SizeF(intPrintAreaWidth, intPrintAreaHeight), Fmt, out intCaratteriInseriti, out intLineeInserite);



e.Graphics.DrawString(rtbTesto.Text, fntSTampa, Brushes.Black, RctAreaDiStampa, Fmt);



//conto il carattere che sto inserendo



IntCarattere += intCaratteriInseriti;



//verifico se devo inerire una pagina aggiuntiva



if (IntCarattere < rtbTesto.Text.Length)



{



e.HasMorePages = true;



}



else



{



e.HasMorePages = false;



//riporto a zero il contatore



IntCarattere = 0;



}



}



catch (Exception ex)



{



MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);



}



}







Facciamo doppio click sul pulsante che avrà il compito di visualizzare l’anteprima di stampa
Utilizzando un oggetto di tipo “PrintPreviewDialog” , tramite il metodo showdialog, verrà aperta una finestra di anteprima, dopo aver impostato le proprietà “Document”, con l’oggetto printdocument, e la proprietà “StartPosition” per indicare la posizione della finestra di anteprima.
Qui di seguito si riporta il frammento di codice.




VB.Net



Private Sub BtnAnteprima_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAnteprima.Click



Dim ppdStampa As New PrintPreviewDialog()



Try



With ppdStampa





.Document = pdocStampa



.StartPosition = FormStartPosition.CenterScreen





.ShowDialog()



End With





Catch ex As Exception



MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error)



End Try



End Sub





C#



private void BtnAnteprima_Click(object sender, EventArgs e)



{



PrintPreviewDialog ppdStampa = new PrintPreviewDialog();



try



{



ppdStampa.Document = pdocStampa;



ppdStampa.StartPosition = FormStartPosition.CenterScreen;



ppdStampa.ShowDialog();



}



catch (Exception ex)



{



MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);



}



}





Passiamo ora al pulsante che avrà il compito di visualizzare la finestra delle opzioni di stampa.
Tramite la classe PageSetup, viene gestita la finestra per impostare le opzioni di stampa.
Qui di seguito si riporta un esempio di codice per l’evento click del pulsante opzioni.





VB.Net



Private Sub BtnOpzioni_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpzioni.Click



'creo un oggetto di tipo finestra di opzioni di stampa



Dim psdOpzioni As New PageSetupDialog()



Try



With psdOpzioni





.Document = pdocStampa



.PageSettings = pdocStampa.DefaultPageSettings



End With



If psdOpzioni.ShowDialog = DialogResult.OK Then



pdocStampa.DefaultPageSettings = psdOpzioni.PageSettings





End If



Catch ex As Exception



MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error)





End Try



End Sub





C#



private void BtnOpzioni_Click(object sender, EventArgs e)



{



//creo un oggetto di tipo finestra di opzioni di stampa



PageSetupDialog psdOpzioni = new PageSetupDialog();



try



{



psdOpzioni.Document = this.pdocStampa;



psdOpzioni.PageSettings = this.pdocStampa.DefaultPageSettings;



if (psdOpzioni.ShowDialog() == System.Windows.Forms.DialogResult.OK)



{



this.pdocStampa.DefaultPageSettings = psdOpzioni.PageSettings;



}





}



catch (Exception ex)



{





MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);



}





}









A questo punto, siamo giunti alla conclusione dell’articolo, non ci resta che scrivere il codice per la stampa del documento, e quindi il codice relativo all’evento click
Tramite la classe “PrintDialog” possiamo gestire la stampa in ambito .Net, impostando la proprietà “Document” con l’oggetto della classe printDocument.
Qui di seguito si riporta il codice completo relativo all’evento click del pulsante per la stampa.






VB.Net



Private Sub btnFinestra_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFinestra.Click



'creo un oggetto di tipo finestra di dialogo di stampa



Dim pdlgStampa As New PrintDialog()



Try



'toglie la finestra pop up



pdocStampa.PrintController = New System.Drawing.Printing.StandardPrintController()



pdlgStampa.Document = pdocStampa



If pdlgStampa.ShowDialog = DialogResult.OK Then



pdocStampa.Print()



End If





Catch ex As Exception



MessageBox.Show(ex.Message, "Stampa", MessageBoxButtons.OK, MessageBoxIcon.Error)



End Try



End Sub





C#



private void btnFinestra_Click(object sender, EventArgs e)



{



//creo un oggetto di tipo finestra di dialogo di stampa



PrintDialog pdlgStampa = new PrintDialog();



try



{



//toglie la finestra pop up



this.pdocStampa.PrintController = new StandardPrintController();



pdlgStampa.Document = pdocStampa;



if (pdlgStampa.ShowDialog() == System.Windows.Forms.DialogResult.OK)



this.pdocStampa.Print();





}



catch (Exception ex)



{





MessageBox.Show(ex.Message, titolo, MessageBoxButtons.OK, MessageBoxIcon.Error);



}





}







Conclusioni



L’articolo ha voluto fornire le conoscenze per gestire la stampa in ambiente windows Application, mostrando alcune delle classi per la stampa messa a disposizione dal Framework .Net 4.
Affrontando in maniera completa le tecniche più comuni, che ogni programmatore potrà affrontare durante lo sviluppo del software.
Tramite la parola download è possibile scaricare il file d’esempio. Nel prossimo articolo, vedremo come stampare una form, con i relativi controlli.




Download