54 messaggi dal 13 settembre 2010
Buongiorno a tutti.
Sto sviluppando un'applicazione in .NET per la gestione di commesse lavorative.
Ogni commessa è composta da dati, alcuni presenti nel db altri invece "calcolati" cioè non sono salvati in db ma sono il risultato (calcolato nel page_load) di operazioni tra dati presenti in db.
Ho scelto di rappresentare le commesse attraverso una gridview.
Essendoci dei dati "calcolati" non posso utilizzare un semplice sqldatasource da associare alla gridview ma andrò ad inizializzare la griglia dal page_load con una funzione che ricava i dati dal db e li inserisce in una datatable, ricava i dati "calcolati" e fa il bind della datatable sulla gridview.
Fin qui tutto ok, la select funziona correttamente.

Non essendoci il canonico sqldatasource le operazioni di inserimento modifica, cancellazione, ordinamento, paginazione come posso gestirle??
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
potresti utilizzare un ObjectDataSource che ti garantisce un maggior controllo sui dati che vanno e vengono dalla GridView. Avrai l'opportunità di trasformare i dati prima che vengano passati alla GridView. Inoltre, come altri DataSourceControl, supporta l'aggiornamento, l'inserimento e l'eliminazione. Dovrai scrivere una tua classe contenente un metodo per ognuna di queste operazioni.
Leggi qui, trovi un bell'articolo con degli esempi di codice.
http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.objectdatasource%28v=vs.80%29.aspx

In alternativa, potresti continuare ad usare un SqlDataSource se lasciassi SqlServer generare per te i valori delle colonne calcolate. Potresti aggiungere delle stored functions al tuo database, e poi usarle così dal SelectCommand del SqlDataSource.

SelectCommand="SELECT Nome, Cognome, dbo.CalcolaEta(DataDiNascita) As Eta FROM Impiegati"


ciao
Modificato da BrightSoul il 22 marzo 2012 19.46 -

Enjoy learning and just keep making
54 messaggi dal 13 settembre 2010
Ciao,
grazie mille della risposta, davvero utilissima.
Ho dato un occhio al controllo ObjectDataSource ma mi pare molto complesso.
Utilizzando le stored function (prima non sapevbo nemmeno cosa fossero!) sono riuscito (anche se solo parzialmente) nel mio intento.
Sono riuscito ad estrapolare i dati calcolati relativi al singolo record ma ti spiego ora cosa mi manca:

Ogni commessa è composta da 5 gridview, ogni record di ogni gridview ha un campo numerico prezzo (calcolato attraverso la stored function).
Io dovrei riuscire a far visualizzare il totale di ogni gridview, cioè una semplice label con la somma dei campi prezzo dei record della singola gridview.

Poi alla fine anche la somma dei 5 totali parziali relativi alle 5 gridview.

Con le stored function è impossibile.
Hai per caso altre idee?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
potresti sottoscrivere l'evento RowDataBound di ciascuna GridView così avrai l'opportunità di incrementare, riga dopo riga, il valore di una variabile che al termine di questa operazione ti darà il totale.
Qui trovi un tutorial che spiega come risolvere proprio questa situazione.
http://social.msdn.microsoft.com/Forums/it-IT/aspnetit/thread/667c82a9-1ebd-4464-aa77-d60b06fa7feb/

Ora, tu non hai una sola GridView quindi devi trovare un modo per riportare a 0 quella variabile prima che si verifichino gli eventi RowDataBound della GridView successiva.

Predisponi anche una seconda variabile che incrementerai per poter conoscere il grantotale.

ciao
Modificato da BrightSoul il 24 marzo 2012 15.20 -

Enjoy learning and just keep making
54 messaggi dal 13 settembre 2010
Ottimo, grazie!
Dopo ore di programmazione ci sono riuscito!
In effetti ho utilizzato il rowdatabound per ogni gridview e al termine dell'aggiornamento del totale parziale relativo alla singola gridview faccio una chiamata ad una funziona calcolaTotali che calcola la somma di ogni griview (il grantotale). Sono riuscito a calcolare anche le percentuali sul grantotale!

Visto che ci siamo vorrei chiederti un'altra dritta...
Avrei necessità di stampare queste famose commesse, sia singolarmente sia lanciando una stampa multipla di più commesse (magari previa selezione tramite checkbox).

Pensavo di procedere così:
Nella gridview che visualizza le commesse pensavo di creare una colonna per i checkbox. Poi un pulsante stampa collegato ad una funzione che controlla se il checkbox di ogni riga è chekkato. Se è chekkato chiama una ulteriore funzione (passandogli l'id) che si occupa di selezionare i singoli dati della commessa. A questo punto ho tutti i dati che mi servono...
Come potrei lanciare la stampa tenendo presente che potrebbero esserci più commesse da stampare una dietro l'altra?
Hai idee in merito?

La stessa procedura valida per la stampa cartacea sopra descritta servirebbe per la stampa in pdf.
11.886 messaggi dal 09 febbraio 2002
Contributi
gdalbell ha scritto:

Dopo ore di programmazione ci sono riuscito!

bene, ottimo lavoro :)

Condivido la tua idea delle checkbox. Dopo aver cliccato il tasto "stampa" e recuperato gli ID delle commesse selezionate puoi seguire una di queste due strade:
  • Visualizzi i dati delle commesse nella pagina stessa ma devi nascondere le GridView che erano presenti prima. A tal proposito puoi usare il controllo Asp:MultiView in cui inserirai due "viste": una destinata a contenere le GridView e l'altra pensata per la stampa.
  • Oppure reindirizzi ad una pagina apposita per la stampa. Passagli in querystring l'elenco degli ID delle commesse da stampare. Forse questa seconda soluzione è da preferire perché ti permette più facilmente di svincolarti dalla masterpage e produrre un HTML molto più scarno e idoneo alla stampa.


In un caso o nell'altro, dovrai produrre dell'HTML che verrà poi stampato. Inserisci tutte le commesse selezionate in una List che poi assegnerai al DataSource di un Repeater, così che vengano visualizzate nella pagina.


gdalbell ha scritto:

Come potrei lanciare la stampa tenendo presente che potrebbero esserci più commesse da stampare una dietro l'altra?


Per lanciare automaticamente la stampa metti il comando javascript window.print() nell'attributo onload del body.

<body onload="window.print()">


Inoltre, se volessi stampare una commessa per foglio, metti questo nel SeparatorTemplate del Repeater e causerà un'interruzione di pagina tra l'una e l'altra.
<SeparatorTemplate>
<div style="page-break-after:always"></div>
</SeparatorTemplate>


gdalbell ha scritto:

La stessa procedura valida per la stampa cartacea sopra descritta servirebbe per la stampa in pdf.

Qui puoi scegliere due strade: se gli utenti di questa applicazione sono i tuoi colleghi, potresti installargli una stampante PDF tipo CutePDF Writer ed avere questa funzionalità "a gratis". Se invece vuoi che sia proprio la tua applicazione a generare dei PDF, allora guarda la libreria iTextSharp. Può crearti un PDF partendo da una stringa HTML. Leggi questa discussione, si riferisce all'uso di iTextSharp con MVC ma può esserti utile anche se usi Asp.Net WebForms.
http://forum.aspitalia.com/forum/post/384060/Creare-Pdf-Partire-View-Asp.Net-Mvc.aspx?PageIndex=1

ciao

Enjoy learning and just keep making
54 messaggi dal 13 settembre 2010
Ok!
Mi metto subito al lavoro, prima vorrei essere sicuro di alcune cose:
- dovrei quindi inserire ogni singola commessa (composta da 1 detailsview e 5 gridview) nell'item di un repeater?
- per list intendi il controllo listview e che ruolo avrebbe?
- per quanto riguarda il pdf adotterò itextsharp, con questa libreria è possibile creare il pdf (o i pdf) e salvarlo/i direttamente nel server senza visualizzarlo/i a video? (in maniera multipla, cioè previa scelta dei chekbox dalla gridview delle commesse).

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

gdalbell ha scritto:

- dovrei quindi inserire ogni singola commessa (composta da 1 detailsview e 5 gridview) nell'item di un repeater?

Sì, penso che così sarà molto semplice per l'utente stampare tutte le commesse in un colpo solo. Magari incapsula il DetailsView e le GridView in un controllo utente, così non dovrai duplicare la logica e ti basterà inserirlo nell'ItemTemplate del Repeater.

Controlla sin da subito se l'ouput prodotto è idoneo ad essere stampato. Ad esempio, presumo che chi stamperà i fogli vorrà vederli impaginati in un certo modo, che magari è differente da ciò che vede nella pagina web. In questo caso, almeno, dovrai predisporre un foglio di stile CSS diverso da usare per la stampa.

Potresti avere dei problemi anche con iTextSharp. E' probabile che tu debba scendere a compromessi e generare dell'HTML diverso da quello che ti producono DetailsView e GridView affinché il contenuto del PDF sia impaginato correttamente.

gdalbell ha scritto:

- per list intendi il controllo listview e che ruolo avrebbe?

No, intendevo una lista generica, una List<Commessa> da passare al DataSource del repeater. Tuttavia, se usi un controllo utente questa potrebbe semplicemente essere una List<int>, dove int è l'id della commessa.
<asp:Repater runat="server">
<ItemTemplate>
  <my:Commessa IDCommessa=<%# Container.DataItem %> runat="server" />
<ItemTemplate>
</asp:Repeater>


gdalbell ha scritto:

- per quanto riguarda il pdf adotterò itextsharp, con questa libreria è possibile creare il pdf (o i pdf) e salvarlo/i direttamente nel server

sì, puoi scegliere di salvarlo a disco e/o di mostrarlo a video.


ciao

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.