Update di un campo numerico in DataGrid

giovedì 11 dicembre 2008 - 23.47

motogpdesmo16 Profilo | Senior Member

Salve a tutti,
ho una datagridview composta da 5 colonne di cui la prima contiene l'ID della riga (read-only), poi ci sono 2 testuali (read-only) ed infine 2 di tipo numerico.
Quando clicco sul pulsante "Modifica", le 2 colonne di tipo numerico vengono giustamente trasformate in due textbox in cui posso inserire i valori che desidero. Il problema si verifica al click del pulsante "Salva" e quindi allo scatenarsi del metodo RowUpdating della griglia.
Ho scritto questo codice:


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Mentre l'aspx della stessa griglia è il seguente
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Il problema è che in Punteggio1 e Punteggio2, indipendentemente da quello che scrivo nelle colonne, ottengo sempre 0 come valore.
I campi della tabella del database, relativamente al punteggio1 e punteggio2 sono stati dichiarati come Numeric.

Sapreste aiutarmi per piacere?
Grazie.

0v3rCl0ck Profilo | Guru

>Salve a tutti,

Ciao

>ho una datagridview composta da 5 colonne di cui la prima contiene
>l'ID della riga (read-only), poi ci sono 2 testuali (read-only)
>ed infine 2 di tipo numerico.
>Quando clicco sul pulsante "Modifica", le 2 colonne di tipo numerico
>vengono giustamente trasformate in due textbox in cui posso inserire
>i valori che desidero. Il problema si verifica al click del pulsante
>"Salva" e quindi allo scatenarsi del metodo RowUpdating della
>griglia.
>Il problema è che in Punteggio1 e Punteggio2, indipendentemente
>da quello che scrivo nelle colonne, ottengo sempre 0 come valore.
>I campi della tabella del database, relativamente al punteggio1
>e punteggio2 sono stati dichiarati come Numeric.
>
>Sapreste aiutarmi per piacere?

Il problema sta nel binding del dato preso da db sulla colonna, cioè non ti si vedono i due punteggi corretti? Oppure quando vai in editing, e digiti qualcosa, poi nell'evento RowUpdating non riesci a leggere i valori delle textbox?

>Grazie.

Di niente

-------------------------------------------------------------------
Michael Denny
Senior Software Developer
Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/

motogpdesmo16 Profilo | Senior Member

Ciao e grazie per l'interessamento!
In visualizzazione i dati sono corretti ed anche all'evento RowEditing non ho alcun problema: le celle si trasformano giustamente in textbox e il valore è proprio quello che era presente nella cella. Il problema si verifica all'atto del salvataggio e cioè che, nonostante vada ad apportare modifiche, nelle textbox rimane il "vecchio" valore.

0v3rCl0ck Profilo | Guru

Ti ho preparato un esempietto in allegato, che a me funziona bene.

Ci sono due modi per prendere il dato modificato.

Facendo come hai fatto tu prendendo la textbox:

Dim gridRow As GridViewRow = Me.dtgTest.Rows(e.RowIndex) Dim txtDesc As TextBox = DirectCast(gridRow.Cells(2).Controls(0), TextBox)

Oppure andando a leggere tra i valori presenti nel e.NewValues:

Dim DescDaNewValues As String = DirectCast(e.NewValues("desc"), String)

Fammi sapere se l'esempio ti ha risolto il problema

Enjoy It

-------------------------------------------------------------------
Michael Denny
Senior Software Developer
Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/

motogpdesmo16 Profilo | Senior Member

Ti ringrazio.
Provo penso già entro il primo pomeriggio.
La cosa strana è che il codice che ho postato ha sempre funzionato bene per i campi di tipo testuale. Solo in questo caso, poichè si tratta di campi di tipo numerico, mi sta dando problemi...
Ti terrò aggiornato..

0v3rCl0ck Profilo | Guru

>Ti ringrazio.

Di niente

>Provo penso già entro il primo pomeriggio.
>La cosa strana è che il codice che ho postato ha sempre funzionato
>bene per i campi di tipo testuale. Solo in questo caso, poichè
>si tratta di campi di tipo numerico, mi sta dando problemi...
>Ti terrò aggiornato..

Ok aspetto tue notizie

Ciaoo

-------------------------------------------------------------------
Michael Denny
Senior Software Developer
Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/

motogpdesmo16 Profilo | Senior Member

Nulla da fare. Non funziona neanche con l'esempio che mi hai inviato in allegato (peraltro controlla quell'esempio perchè non mi funziona...). Ti ringrazio comunque...
Il problema è sempre lo stesso: viene tenuto in considerazione sempre il vecchio valore.
Vorrei sottolineare questo concetto: l'update interessa campi numerici. Potrebbe esserci qualche "incompatibilità" tra tipi? Lo stesso codice che ho postato in precedenza funziona alla perfezione quando si tratta di dover apportare modifiche a campi di tipo testo.

0v3rCl0ck Profilo | Guru

>Nulla da fare. Non funziona neanche con l'esempio che mi hai
>inviato in allegato (peraltro controlla quell'esempio perchè
>non mi funziona...).

Se intendi dire che non funziona perchè non aggiorna il valore, è chiaro, non l'ho fatto perchè si aggiornasse, è solo un esempio per farti vedere che il nuovo valore nei 2 modi viene correttamente catturato dalle righe di codice presenti nel RowUpdating.

>Ti ringrazio comunque...
>Il problema è sempre lo stesso: viene tenuto in considerazione
>sempre il vecchio valore.
>Vorrei sottolineare questo concetto: l'update interessa campi
>numerici. Potrebbe esserci qualche "incompatibilità" tra tipi?
>Lo stesso codice che ho postato in precedenza funziona alla perfezione
>quando si tratta di dover apportare modifiche a campi di tipo
>testo.

Forse a questo punto il tuo problema è di salvataggio dei dati, non tanto del fatto che non ti arriva il valore giusto dalla griglia.

Sei sicuro che le funzioni di salvataggio su db ti funzionino?

Inoltre ho notato che hai fatto il cast del valore delle textbox a Double, quindi con virgola. Quando il sistema le converte a stringa potrebbe metterci la virgola.

Il punteggio è un intero o un numero con anche decimali? Se è un intero utilizza la funzione Convert.ToInt32(txt.value).

Hai provato a vedere cosa c'è all'interno della variabile 'cQueryUpd' una volta valorizzata?

Fammi sapere...
Ciaoo

-------------------------------------------------------------------
Michael Denny
Senior Software Developer
Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/

motogpdesmo16 Profilo | Senior Member

Invece io ritengo Il problema sia precedente alla scrittura dei dati nel db in quanto io non sono nemmeno arrivato alla scrittura dei valori. impostando infatti il breakpoint dopo aver castato la cella in textbox ottengo sempre il valore vecchio. Di conseguenza in cQueryUpd ottengo la query con i vecchi valori ma, logicamente, è errata.
I numeri possono essere decimali e, nonostante il cast, vengono valorizzati con la virgola (ad esempio nella datagrid ho "4,000" mentre nel database ho 4.000)

0v3rCl0ck Profilo | Guru

>Invece io ritengo Il problema sia precedente alla scrittura dei
>dati nel db in quanto io non sono nemmeno arrivato alla scrittura
>dei valori. impostando infatti il breakpoint dopo aver castato
>la cella in textbox ottengo sempre il valore vecchio. Di conseguenza
>in cQueryUpd ottengo la query con i vecchi valori ma, logicamente,
>è errata.

Qui bisogna capire il perchè...Hai visto che nel mio esempio funziona correttamente e si riesce a leggere il valore modificato? Provato ad usare e.NewItems, invece che leggere dalla textbox?

>I numeri possono essere decimali e, nonostante il cast, vengono
>valorizzati con la virgola (ad esempio nella datagrid ho "4,000"
>mentre nel database ho 4.000)

Per questo problema devi fare convertire in stringa cambiando la culture:

ValoreDecimale.ToString(Globalization.CultureInfo.InvariantCulture)

Questo ti convertirà la stringa utilizzando l'invariantCulture, che appunto prevede come separatore dei decimali il punto.

-------------------------------------------------------------------
Michael Denny
Senior Software Developer
Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/

motogpdesmo16 Profilo | Senior Member

Niente da fare. Nemmeno con il tuo esempio (che nativamente non mi funziona) riesco a catturare il nuovo valore.
Anche tentando di sfruttare questo codice:
Dim DescDaNewValues As String = DirectCast(e.NewValues("desc"), String)
dove ho sostituito "desc" con "Punteggio1" (nome del mio campo), riesco ad ottenere il nuovo valore.

Non penso inoltre si tratti di un problema di culture perchè nelle variabili "Punteggio1" e "Punteggio2", indipendentemente dal valore, vedo i valori con il separatore "." (punto) e, anche valorizzandole a mano e continuando ad eseguire il codice nella pagina, l'update va a buon fine.

Continuo a pensare ci sia qualche "allergia" tra questo modus operandi ed i valori numerici...

0v3rCl0ck Profilo | Guru

>Niente da fare. Nemmeno con il tuo esempio (che nativamente non
>mi funziona) riesco a catturare il nuovo valore.

Si scusami, ho visto che a runtime, dava un eccezione, perchè tenta di utilizzare il metodo di update per il datasource impostato, che però non ha implementato il metodo di update essendo un xmldatasource. Ho aggiunto l'evento RowUpdated e invalidato l'eccezione. Ho aggiunto 2 textbox, che ti fanno vedere che quando vado a cliccare sul tasto update, vengono presi i nuovi valori che ho digitato. La prima textbox indica il valore preso direttamente dalla textbox, mentre la seconda il valore preso da e.NewValues.

>Anche tentando di sfruttare questo codice:
>Dim DescDaNewValues As String = DirectCast(e.NewValues("desc"),
>String)
>dove ho sostituito "desc" con "Punteggio1" (nome del mio campo),
>riesco ad ottenere il nuovo valore.
>
>Non penso inoltre si tratti di un problema di culture perchè
>nelle variabili "Punteggio1" e "Punteggio2", indipendentemente
>dal valore, vedo i valori con il separatore "." (punto) e, anche
>valorizzandole a mano e continuando ad eseguire il codice nella
>pagina, l'update va a buon fine.
>
>Continuo a pensare ci sia qualche "allergia" tra questo modus
>operandi ed i valori numerici...

Adesso provo a vedere passando come datasource un datatable tipizzato e vediamo, ma io non ho mai avuto nessun tipo di problema.

-------------------------------------------------------------------
Michael Denny
Senior Software Developer
Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/

0v3rCl0ck Profilo | Guru

Ecco prova a vedere anche in questo esempio (in allegato) dove hi utilizzato un DataTable tipizzato come datasource. In questo caso la collezione e.NewValues effettivamente non viene valorizzata, non c'è scritto sulla documentazione, ma viene generato dai DataSource collegati come ad esempio l'xmldatasource o il sqldatasource ecc... Lo si può vedere da come è costruita il metodo HandleUpdate:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Quindi in soldoni se fai il bind della griglia senza impostare un DataSourceID, puoi solo agire sui controlli. Se non vuoi utilizzare lo scomodo cell(1).controls(0), puoi in alternativa crearti delle custom column, e nell'edittemplate vai a mettere una textbox e gli dai un nome; a questo punto dal codice puoi fare Me.dtgTest.Rows(e.RowIndex).FindControl("IDControllo").

-------------------------------------------------------------------
Michael Denny
Senior Software Developer
Microsoft Framework (C# ASP.NET VB.NET)
http://blogs.dotnethell.it/Regulator/

motogpdesmo16 Profilo | Senior Member

nulla da fare...tutto identico...con il tuo esempio funziona, con il mio no.
Mi è venuto però il sospetto che il problema sia nell'evento RowEditing dove io vado a fare queste operazioni:

GrdScheRig.EditIndex = e.NewEditIndex riempigriglia(GrdScheRig, cQuery, "ScheRig")

mentre tu nel tuo esempio fai
Me.dtgTest.EditIndex = e.NewEditIndex _DataBindGridTest()

Apparentemente dovrebbe essere la stessa cosa...
posto anche il conteuto della sub Riempigriglia per maggior completezza:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
ma non ha mai fallito questa sub....

zanatas Profilo | Newbie

Ciao,
posso chiederti come hai risolto?
Ho lo stesso problema e sto uscendo pazzo.
Praticamente nella rowupdating quando vado a leggere i miei EditItemTemplate mi viene ritornato il valore vecchio del campo e non quello nuovo inserito manualmente nella textbox editata.
Non riesco a capire dove sta il problema: perchè non riesco a leggere il nuovo dato inserito per poterlo utilizzare nella query di update?

Ciao e grazie.
Stefano
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5