Una delle cose che gli utenti chiedono è di poter selezionare in blocco un set di dati e stamparli, un esempio banale è questa window per la ricerca di contratti in cui l’utente seleziona uno o più contratti e poi può pigiare il bottone stampa presente nella Quick Access Toolbar del Ribbon:
Un po’ di pubblicità occulta a colui che mi fornisce i controlli: Divelements.
il problema è che se il “report” che nasce da quella richiesta è di più di una pagina avete l’inghippo che la numerazione delle pagine viene sballata perchè il secondo item che stampate avrà la prima pagina numerata con un valore pari all’ultima dell’item precedente + 1… scomodo… decisamente.
Una soluzione che tampona il problema la potete realizzare, stampando direttamente senza passare per il viewer, mandando alla stampante più di un report, ma se l’utente vuole l’anteprima non è che gli possiamo far vedere n report viewer tanti quanti sono gli item selezionati sarebbe poco usabile.
I Report di Visual Studio, e anche i Reporting Services, non supportano nativamente questa funzionalità ma non è un problema farsela:
Dopo aver creato un nuovo report andate sulle proprietà e visualizzate la scheda Code:
nell’area Custom code incollate il seguente snippet:
Shared offset as Integer
Shared currentgroup as Object
Public Function GetGroupPageNumber(group as Object, pagenumber as Integer) as Object
If Not (group = currentgroup)
offset = pagenumber - 1
currentgroup = group
End If
Return pagenumber - offset
End Function
A questo punto potete inserire nel vostro report un controllo List, assicuratevi che il controllo list contenga una TextBox (va benissimo anche Hidden) che visualizza il valore della group-key della lista stessa:
e nel report ad esempio:
Date un nome “sensato” a quella TextBox, ad esempio: mainGroupingKey. Fatto questo potete visualizzare il numero di pagina corrente in questo modo:
lo snippet di cui sopra farà in modo che il numero si resetti al cambio di “gruppo” ripartendo da 1.
ndr 1:
La cosa funziona anche con i reporting services con il rischio però di collisioni perchè le variabili “shared” verrebbero condivise anche tra più istanze dello stesso report che venissero malauguratamente richieste in maniera concorrente, probabilmente un evento abbastanza remoto… ma sempre da considerare.
ndr 2:
L’idea non è mia, googlando ho trovato un po’ di spunti ma non riesco più a risalire alla fonte quindi non posso linkarla, io mi sono limitato solo a fare qualche aggiustamento per adeguare il tutto al mio scenario.
.m