Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Consigli Stampa dinamica con .Net
lunedì 17 dicembre 2007 - 14.27
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
DOJ
Profilo
| Newbie
14
messaggi | Data Invio:
lun 17 dic 2007 - 14:27
Ciao a tutti,
avrei bisogno alcune informazioni per creare una stampa "dinamica" con .Net.
Vi spiego la mia situazione: io ho un PrintDocument "padre" nel quale devo gestire una stampa dinamica; questa stampa consiste nel chiamare nel PrintDocument "padre" altri PrintDocument che stampano delle piccole tabelle.
Domane:
- è possibile richiamare questi PrintDocument evitando che essi scrivano su una pagina nuova e stamparli nel PrintDocument "padre"?
- non avendo molta esperienza, mi sono cimentato con l'utilizzo dei PrintDocument: con questo metodo è possibile arrivare alla soluzione sperata o esistono altre soluzioni?
Vi ringrazio già ora della vostra disponibilità.
Ciao
.
DOJ
alextyx
Profilo
| Expert
668
messaggi | Data Invio:
lun 17 dic 2007 - 15:43
Vediamo un po', intanto ti segnalo un piccolo lavoretto che potrebbe servirti da spunto e che gestito da codice, potrebbe forse anche risolverti il problema:
http://forum.masterdrive.it/area-beta-testing-progetti-open-source-45/vb2005-gestione-delle-stampe-crystal-report-21142/
Comunque, per rientrare nell'oggetto del contendere, se ho ben capito tu stai usando il metodo print di un printdocument.
Il modo che hai di rimanere all'interno della stessa stampa, è quello di continuare a dire che la tua stampa 'HasMorePages', come immagino tu abbia già capito. Ovviamente questo presume che tu abbia pronte le tabelle e quando il codice arriva arriva alla fine della prima, parti ad accodare la seconda, poi la terza e così via, finchè non avrai finito. A quel punto potrai dire 'HasMorePages'=False.
Oppure, usi la classe scaricabile dal link, riempi da codice le varie righe, volendo anche lasciandone alcune bianche e/o cambiando colore tra una tabella e l'altra, e poi esegui la tua stampa, tutta d'un fiato!
Se hai bisogno di aiuto per l'uso, puoi postare anche direttamente a quell'indirizzo, perchè tutte le varie 'FAQ' serviranno a chi deve usare quel codice.
Per altre richieste, sperando di poterle soddisfare, rimango in attesa.
Spero di poter capire meglio le tue esigenze, da quello che mi risponderai.
DOJ
Profilo
| Newbie
14
messaggi | Data Invio:
mar 18 dic 2007 - 07:44
Penso di aver capito a grandi linee ciò che tu mi hai spiegato ma cosi facendo credo che ogni tabella (che viene "disegnata" richiamando un PDoc all'interno del PDoc "padre") viene stampata in un nuovo foglio. Quello di cui ho bisogno io è ke richiamando questi PDoc essi stampino tutti in una pagina unica. Provo a farti un esempio cosi forse mi spiego meglio:
parte il pdoc principale in cui stampo sul foglio l'intestazione della pagina; a questo punto ho bisogno di aggiungere a questo foglio una determinata tabella, quindi richiamo il pdoc che scrive questa tabella specifica. Se io richiamo questo pdoc esso stampa nelle giuste coordinate ma in nuova pagina, ma io ho bisogno che questa tabella venga stampata direttamente sul primo foglio, quello su cui ho stampato l'intestazione.
Se nn mi sono spiegato bene posso provare a spiegarmi meglio.
Se invece la soluzione è proprio quella che tu mi hai illustrato precedentemente potresti magari mettermela giù un po "terra terra"?
Grazie ancora.
DOJ.
alextyx
Profilo
| Expert
668
messaggi | Data Invio:
mar 18 dic 2007 - 09:38
Vai al link che ti ho postato e forse la soluzione è lì bella e pronta, visto che ti mette a disposizione una classe per stampare con tanto di intestazioni e fondo pagina, modificabile e inseribili, o meno, pagina per pagina.
Prova ad usare il progettino di esempio e guarda come si comporta.
Inoltre, dato che il codice è tutto disponibile e ampiamente commentato, può essere una base per implementare delle soluzioni proprietarie.
the_follet
Profilo
| Newbie
46
messaggi | Data Invio:
mar 18 dic 2007 - 11:30
Mi permetto...
Propongo una soluzione "poco elegante" ma che a me ha risolto tutti i mal di testa che mi venivano quando dovevo generare e stampare un report (non ho mai imparato ad usare i Crystal Reports e non so se lo farò mai...).
La classe System.Drawing offre degli strumenti ECCEZIONALI anche per la gestione e la formattazione del testo, oltre che per il disegno in generale.
Mi sono reso conto che creare una Bitmap (ad esempio delle dimensioni di un A4) ed usare il sistema di coordinate per scrivere ed allineare il testo è di una velocità e semplicità estrema.
Con 2 rapidissimi calcoli (in particolare usando la funzione Graphics.MeasureString) puoi sapere in anticipo se il tuo documento verrà stampato su una o più pagine.
In ipotesi di documenti a pagine multiple puoi utilizzare un'ArrayList di Bitmap e sfruttare tutte le comodità offerte dalla interfaccia Ilist (i metodi Add, Remove, Count, etc.).
Insomma, io ho provato questa soluzione con un pò di scetticismo (in quanto spinto dalla disperazione dopo i salti mortali per gestire l'esportazione in Word o Excel) e sono rimasto letteralmente sconvolto dalla sua efficacia.
E' ovvio che dal punto di vista strettamente tecnico (almeno a mio avviso) rappresenta un'operazione alquanto "rozza"... però è incredibilmente funzionale
Saluti,
Luca
DOJ
Profilo
| Newbie
14
messaggi | Data Invio:
mar 18 dic 2007 - 12:41
Ho provato ad analizzare e ad eseguire il programma di cui mi hai postato il link ma nn sono venuto a capo di niente.
In sostanza io vorrei riuscire a capire se utilizzando il metodo dei PDoc è possibile raggiungere il tanto ambito traguardo.
In particolare vorrei sapere se esiste qualche parametro che posso passare al Pdoc figlio dal PDoc padre in modo da nn fare stampare il pdoc figlio su un nuovo foglio.
Per evitare di sprecare carta a fiumi, per vedere le anteprime delle stampe sto utilizzando la broadgun pdf machine in modo da vedere in formato pdf il prodotto delle mie stampe. Il problema è che se io lancio il pdoc padre nel quale vengono chiamati per esempio 3 pdoc figli mi vengono generati 4 file pdf, ognuno con una stampa di un singolo pdoc. vedendo ciò deduco che se io lanciassi la stampa su una stampante normale mi uscirebbero 4 fogli ognuno con una stampa di un pdoc. Per quanto riguarda i salti pagina e le gestioni dei documenti su pagine multiple al momento x me nn è un problema, più che altro mi interessa giungere alla conclusione di poter lanciare più pdoc che possano scrivere sul medesimo foglio.
Spero di essere stato abbastanza esauriente, eventualmente sono disponibile per ogni tipo di chiarimento.
Grazie ancora a chiunque possa e voglia darmi una mano.
Ciao.
DOJ
alextyx
Profilo
| Expert
668
messaggi | Data Invio:
mar 18 dic 2007 - 13:57
>Ho provato ad analizzare e ad eseguire il programma di cui mi
>hai postato il link ma nn sono venuto a capo di niente.
>In sostanza io vorrei riuscire a capire se utilizzando il metodo
>dei PDoc è possibile raggiungere il tanto ambito traguardo.
>In particolare vorrei sapere se esiste qualche parametro che
>posso passare al Pdoc figlio dal PDoc padre in modo da nn fare
>stampare il pdoc figlio su un nuovo foglio.
>Per evitare di sprecare carta a fiumi, per vedere le anteprime
>delle stampe sto utilizzando la broadgun pdf machine in modo
>da vedere in formato pdf il prodotto delle mie stampe. Il problema
>è che se io lancio il pdoc padre nel quale vengono chiamati per
>esempio 3 pdoc figli mi vengono generati 4 file pdf, ognuno con
>una stampa di un singolo pdoc. vedendo ciò deduco che se io lanciassi
>la stampa su una stampante normale mi uscirebbero 4 fogli ognuno
>con una stampa di un pdoc. Per quanto riguarda i salti pagina
>e le gestioni dei documenti su pagine multiple al momento x me
>nn è un problema, più che altro mi interessa giungere alla conclusione
>di poter lanciare più pdoc che possano scrivere sul medesimo
>foglio.
>Spero di essere stato abbastanza esauriente, eventualmente sono
>disponibile per ogni tipo di chiarimento.
>Grazie ancora a chiunque possa e voglia darmi una mano.
>Ciao.
>DOJ
"parte il pdoc principale in cui stampo sul foglio l'intestazione della pagina; a questo punto ho bisogno di aggiungere a questo foglio una determinata tabella, quindi richiamo il pdoc che scrive questa tabella specifica. Se io richiamo questo pdoc esso stampa nelle giuste coordinate ma in nuova pagina, ma io ho bisogno che questa tabella venga stampata direttamente sul primo foglio, quello su cui ho stampato l'intestazione."
Quello che dici, mi sembra pane per il codice verso cui ti ho indirizzato.
Se esistono altre esigenze, invece forse va modificato.
Se mi dici cosa non sei riuscito ad ottenere, magari ci possiamo lavorare su.
In linea generale, comunque, devi utilizzare un solo evento PrintPage per ogni pagina. Devi accodare da codice le cose in modo da riempire la pagina e poi preparare il materiale per la successiva, che verrà stamapata sul successivo evento printpage.
Per questo ci sono da fare una serie di calcoli sull'ingombro delle stringhe e sull'altezza residua dell'area di stampa, esattamente come viene fatto nel codice che hai scaricato.
Ciò che non potrà entrare nella pagina attuale, sarà riportato nella successiva, la cui gestione sarà avviata accodando un ulteriore evento PrintPage, mediante l'uso di HasMorePages=True.
Anche se sono più aggrovigliati che difficili, purtroppo non si riesce ad evitare di doversi sobbarcare alcuni calcoli per il posizionamento del materiale nella pagina.
Quindi per quanto riguarda la tua richiesta:
"In sostanza io vorrei riuscire a capire se utilizzando il metodo dei PDoc è possibile raggiungere il tanto ambito traguardo. In particolare vorrei sapere se esiste qualche parametro che posso passare al Pdoc figlio dal PDoc padre in modo da nn fare stampare il pdoc figlio su un nuovo foglio."
La risposta è che non solo non puoi usare due printdocument diversi, per stampare sulla solita pagina, ma devi inserire tutto ' a manina' nella gestione di un singolo evento PrintPage. Se invochi un ulteriore metodo print, anche dallo stesso printdocument, avrai un nuovo evento printpage, ovvero inizierai una nuova pagina.
DOJ
Profilo
| Newbie
14
messaggi | Data Invio:
mar 18 dic 2007 - 14:14
Ok, quindi posso abbandonare questa strada. Ma dato che è un lavoro importante e urgente che devo svolgere ti rigiro la domanda per provare a intraprendere un'altra strada: è possibile avere un unico pdoc ma che al suo interno richiama delle sub ognuna delle quali corrisponde alla stampa di una griglia determinata (supponendo quindi che esse siano delle "normali" sub, non dei pdoc)?
purtroppo devo insistere con questa stampa modulabile xchè queste griglie che devo stampare sono più di una quarantina, il loro ordine di stampa deve essere "interscambiabile" e impostabile dall'utente; quindi non posso gestire tutto ciò con delle if xchè diventerebbe un delirio gestire poi delle future modifiche.
Grazie ancora di tutto.
DOJ
alextyx
Profilo
| Expert
668
messaggi | Data Invio:
mar 18 dic 2007 - 14:35
>Ok, quindi posso abbandonare questa strada. Ma dato che è un
>lavoro importante e urgente che devo svolgere ti rigiro la domanda
>per provare a intraprendere un'altra strada: è possibile avere
>un unico pdoc ma che al suo interno richiama delle sub ognuna
>delle quali corrisponde alla stampa di una griglia determinata
>(supponendo quindi che esse siano delle "normali" sub, non dei
>pdoc)?
>purtroppo devo insistere con questa stampa modulabile xchè queste
>griglie che devo stampare sono più di una quarantina, il loro
>ordine di stampa deve essere "interscambiabile" e impostabile
>dall'utente; quindi non posso gestire tutto ciò con delle if
>xchè diventerebbe un delirio gestire poi delle future modifiche.
>Grazie ancora di tutto.
>DOJ
La risposta è Sì!
Scrivendo qualche centinaio di righe di codice, se non un migliaio!
Quello che ti servirebbe, è la ipotizzata futura evoluzione di quel codice che hai visto. In pratica un supervisore di classi di stampa, che permettesse di accodarle una all'altra, anche inframezzandoci immagini e quant'altro.
Mentre, limitandoci a ciò che abbiamo, saresti vincolato ad avere lo stesso numero di colonne per tutte le griglie e gli stessi nomi delle colonne , in quanto non è previsto di cambiarli, all'interno di una stessa pagina.
Probabilmente dovrai ricorrere ad un software di reporting di quelli robusti. Ce ne sono anche di gratuiti e puoi anche usare quello di microsoft, che viene fornito con SQL2005Express. Dicono sia una bomba. Anche meglio di Crystal Report ed è pure gratuito. Purtroppo, il suo utilizzo comporta qualche complicazione, alla soluzione della quale non sono la persona più adatta a condurti, in quanto non me ne sono mai occupato, almeno per ora.
Torna su
Stanze Forum
Elenco Threads
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 !