[VB2005] Stampare con GDI+ e proprietà HasMorePages

martedì 10 febbraio 2009 - 11.51

Teech Profilo | Expert

Premetto che è la prima volta che mi approccio a GDI+ e alle stampe con questa tecnologia. Il motivo è che vorrei implementare le stampe sui miei assembly ed utilizzare i dati delle classi invece di ADO.NET.
Ho iniziato a studiare e mi sembra concettualmente semplice.

Per fare una stampa non conoscendo l'esatta occupazione in termini di pagine ho trovato un bel codice che ho pensato di adottare dove viene creata una classe che eredita da PrintDocument e l'estende con 2 proprietà: Text as String() e OffSet as Integer.
Nel gestore dell'evento PrintPage viene creato un Loop e all'interno viene gestita la prioprietà Offset del PrintDocument personalizzato per iterare su ogni elemento dell'array Text. Calcolando quando si arriva a fine pagina (date le dimensioni) se Offset corrisponde all'indice dell'ultimo elemento dell'array Text la proprietà HasMorePages sarà =False altrimenti =True

Ho però un problema logico da risolvere che mi tormenta e per il quale non ho trovato risposte.
Il meccanismo è semplice quando si tratta di stampare sequenzialmente un array di oggetti omogenei (o comunque che implementano le stesse interfacce o sono ereditati), ma quando questi oggetti sono eterogenei e strutturati in modo gerarchico fra di loro?
Mi spiego meglio:
Ho una classe Cliente per il quale voglio stampare alcuni dati (proprietà della classe), per ogni cliente posso recuperare una classe collection di tutte le Commesse di questo Cliente e per ogni Commessa nella collection posso recuperare una ulteriore collection di Componenti...
Non posso usare la ricorsione per leggere i dati in quanto gli oggetti sono eterogenei.
Ho pensato, molto semplicemente di controllare se esistono ulteriori dati nella collection che stò analizzando e in caso contrati se esistono ulteriori dati nelle collection di "livello superiore" (attraverso OffSet differenziati) ma non riesco a capire come faccio a sapere dove mi trovo quando rientro nel gestore dell'evento PrintPage e per quale OffSet devo continuare il ciclo...

Non credo di essermi spiegato molto bene (appena avrò un codice "comprensibile" lo posterò) ma è un pò come gestire le sezioni in Crystal Report ma in GDI+.

Grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

freeteo Profilo | Guru

Ciao e perdona il ritardo nella risposta, probabilmente avrai già risolto cmq ti rispondo lo stesso.

>Non posso usare la ricorsione per leggere i dati in quanto gli
>oggetti sono eterogenei.
perchè no? puoi fare una ricorsione con "object" o "IEnumerable" se passi liste come parametro e poi controllare il tipo e tirare fuori le proprietà che ti interessano.
Tipo:
void FunzioneRicorsiva(....,StringBuilder sb) if(ele.GetType() == typeof(Commessa) { Commessa c = ele as Commessa; sb.Append(c.PrezzoPattuito); .... } if(ele.GetType() == typeof(Cliente) { Cliente c = ele as Cliente; sb.Append(c.RagioneSociale); .... } etc...

ho ipotizzato ti passi uno stringbuilder nella funzione ricorsiva per farti riempire una stringona lunga con tutto quello che deve stampare, ma era solo un esempio, quello che voglio dire è il fatto di fare i vari confronti sui tipi.



>Non credo di essermi spiegato molto bene (appena avrò un codice
>"comprensibile" lo posterò) ma è un pò come gestire le sezioni
>in Crystal Report ma in GDI+.
più che altro non so se ho capito bene, ma cmq sia credo che il problema sia la funzione Ricorsiva più che il fatto che usi PrintDocument...

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5