Prendo spunto da
questa risposta sul forum di
DotnetHell.it per segnalare un trucchetto simpatico per fare stampe "orizzontali" (tipicamente intese come "etichette") distribuendo i dati da visualizzare su tutto il foglio di stampa.
Ho pensato di riportare la spiegazione che ho dato, integrandola anche con qualche screenshot in modo possa essere d'aiuto anche per chi non bazzica sul forum:
Il tutto viene dal pensiero di avere i visualizzati in questo modo (esempio con 3 colonne):
1 - 2 - 3
4 - 5 - 6
7 - 8 - 9
....
che se li guardiamo verticalmente (dato che abbiamo solo questa direzione di ripetzione disponibile) il primo visualizza i record 1,4,7... il secondo i record 2,5,8...il terzo i record 3,6,9 e via cosi'.
Questa discriminante di record visualizzati è proprio il resto della divisione per 3 (nel caso di 3 colonne) che ci viene data dalla funzione "Mod" (perche' i report parlano codice vb.net) che in c# è l'operatore "%".
Questa idea, la possiamo usare insieme al fatto che con Sql Reporting (quindi sia RDL, che RDLC) possiamo mettere nella sezione "Body" del report diversi elementi "ripetitori" (List o Table), che ripetono i dati verticalmente indipendentemente gli uni dagli altri.
In piu' tutti gli elementi che ripeti sono oscurabili tramite la proprieta' "Visibility.Hidden" dove è possibile usare delle formule (Expression) per discriminarne a runtime il comportamento, ci manca solo avere le funzioni "Mod" e qualcosa che ci dica che record stanno visualizzando i singoli ripetitori "RowNumber(...)" , per sapere di questi quali visualizzare o meno.
Come si vede dalla figura, per evitare di mettere la formula di Visibility.Hidden per ogni elemento textbox con i dati, ho messo un "Rectangle" che mi faccia da contenitore, ma è stata solo una comodita'.
Una cosa da tenere ben presente invece, è di fare questa operazione di oscuramento sulle righe e non sui ripetitori, questo perche' ogni ripetitore deve cmq avere tutte le righe e decidere lui quali saltare (tramite formula) , ma non deve essere nascosto lui per intero.
Un esempio è sicuramente piu' chiaro:
Facciamo ad esempio una stampa di record su 3 colonne sul db NorthWind classico:
- Metti 3 List (o 3 Table) nel body
- Le agganci tutte e 3 alla stessa datasource (proprieta' DataSourceName)
- I Componenti li nascondi (visibility-Hidden) secondo queste formule:
1a Lista => iif(RowNumber(Nothing) mod 3 = 1, false , true)
2a Lista => iif(RowNumber(Nothing) mod 3 = 2, false , true)
3a Lista => iif(RowNumber(Nothing) mod 3 = 0, false , true)
il "false e il true" sono invertiti perche' la proprieta' è "visibility-Hidden" e quindi va al girata.
lL risultato è questo:
Ovviamente questo esempio è con 3 colonne, e usa una List, ma è fattibile anche con table e con qualsiasi numero "ragionevole" di colonne, ad esempio se volessimo 5 colonne:
- mettiamo 5 liste
- alla visibility.hidden dei valori modificare ad esempio:
1a Lista => iif(RowNumber(Nothing) mod 5 = 1, false , true)
2a Lista => iif(RowNumber(Nothing) mod 5 = 2, false , true)
3a Lista => iif(RowNumber(Nothing) mod 5 = 3, false , true)
4a Lista => iif(RowNumber(Nothing) mod 5 = 4, false , true)
5a Lista => iif(RowNumber(Nothing) mod 5 = 0, false , true)