[AspNet 3.5] Gridview - attivare modifica su 1 sola colonna

martedì 18 maggio 2010 - 13.10

darkeric Profilo | Senior Member

Buongiorno a tutti

volevo creare un sito web di E-commerce
rimango bloccato al carrello e vi spiego il perchè

ho creato una gridiew associata ad un accessdatasource per visualizzare gli elementi
contenuti nel carrello.

in una colonna ho creato un modello in cui inserisco una textbox e 1 button
la textbox è agganciata al campo "quantita" della tabella "tabella_carrello"
e riporta ovviamente la quantità ordinata dal cliente. (tutto questo ovviamente perchè
vorrei che fosse modificabile)

ho provato ad eseguire l'update quando si clicca sul button "aggiorna" scrivendo questo codice:

public sub......button_click......
dim box as textbox = directcast(................., textbox)
dim indice as string
indice = gridview1.selectedrow.cells(1).text
accessdatasource1.updatecommand =("Update tabella_carrello Set quantita = '" + box.text + "'
where id = '"+ indice + "'")

accessdatasource.update()

facendo il debug i valori della varibile indice e il valore della proprietà text di box sono
quelli che dovrebbe salvare quindi sul prelievo dei dati è ok

solo che non viene salvato nulla

ho provato anche a inserire una try...catch...
ma il debug va avanti regolarmente

non da nessun erroe ma non salva.

a questo punto ho provato a utilizzare la funzione modifica della gridview
attivando il comando

però quando lo clicco mi da la possibilità di modificare tutti i campi
mentre io voglio modificare solo la quantità

come devo procedere secondo voi?

grazie a chi mi risponderà

Fabio






martinez Profilo | Senior Member

Ciao,

senza entrare nei dettagli del tuo codice ... Per far si che alcuni campi di una griglia non siano aggiornabili occorre trasformare gli stessi in TemplateField e sostituire il template UPDATE con delle label al posto delle TextBox ... in tal modo l'utente può solo visualizzare quei campi non aggiornabili ...

Sperando di essere stato chiaro saluto!
Antonio

darkeric Profilo | Senior Member

stasera vedo di provarci e ti faccio sapere!

grazie per la risposta!

p.s. il codice l'ho riscritto a memoria solo come esempio, quindi ci sarà sicuramente qualche errore

darkeric Profilo | Senior Member

Ho provato la soluzione da te propostami

effettivamente al click su modifica, mi abilità per la scrittura solo la casella da me richiesta

però quando aggiorno mi memorizza solo il valore di quella cella mentre le altre me le mette NULL
ho provato a modificare l' Updatecommand togliendo tutti i campi tranne la quantità, ma se faccio questo
non memorizza neanche quella

la stringa è questa:
update tabella_carrello SET quantita = ? Where Id = ?

che faccio?

martinez Profilo | Senior Member

Ciao,

io aggiornerei tutti i campi con i valori di default modificando in tal modo l'unico aggiornabile il tutto per uno specifico ID di tabella per meglio dire:

UPDATE tabella_carrello SET Quantita= @Quantita, Campo= @Campo Campo1 = @Campo1 ... Campox = @Campox WHERE (ID = @ID)

darkeric Profilo | Senior Member

quella era la stringa originale che però non mi memorizzava gli altri valori tranne quello quantità

a meno che (scusa per l'ignoranza ma sono novizio) dire (campo = @campo) invece di (campo = ?) ha un significato diverso

grazie per la pazienza!

martinez Profilo | Senior Member

Ciao,

non preoccuparti :) chiedere non costa nulla :)

allora la differenza in teoria tra i parametri ? ed @nomecampo non dovrebbe esistere ... è solo che nel secondo modo si ha una pulizia migliore del codice e si riesce ad individuare prima gli eventuali problemi ...

Provo a spiegarmi meglio io presuppongo che tu abbia un SqlDataSource ed una GridView associata ...

quindi se provi a prendere una pagina aspx pulita (nuova) ed inserisci un SqlDataSource segui la procedura del wizard per "Configura origine dati" selezioni nella prima maschera la tua stringa di connessione oppure il DB che vuoi utilizzare e vai avanti ... se hai selezionato una stringa di connessione il passo successivo e quello di selezionare la tabella ed i campi che ti interessano da DB se invece hai selezionato il DB avrai un'ulteriore pagina che ti chiede se vuoi memorizzare la stringa di connessione nel tuo web.config ... qui risponderai si chiaramente ...

Passo importante nella pagina in cui selezioni la tabella ed i campi relativi (ti consiglio di selezionare tutti i campi uno ad uno e di evitare di selezionare solo l'asterisco) devi scegliere il pulsante avanzate (si trova a destra della maschera) e nella finestra che si apre devi selezionare l'opzione "genera istruzione INSERT UPDATE e DELETE" nella schermata successiva o scegli fine oppure puoi anche visualizzare un test della connessione ... Insomma USA il wizard che fa tutto lui :)

Successivamente ... inserisci una griglia ed associala al datasource ... clicca anche qui su attività della griglia e seleziona l'origine dati del datasource e quindi "modifica colonne" e nella finestra successiva seleziona tutti i campi generati uno ad uno e convertili in templateFiled ... Inserisci infine i pulsanti per update e delete ... e chiudi tutte le finestre
a questo punto passa alla visualizzazione "origine" della tua pagina e sostituisci tutte le textbox per "EditItemTemplate" dei campi non modificabili con delle label lasciando invariata però l'opzione TEXT del campo ...

fatto questo l'ancia in debug la pagina e vedrai che tutto funziona in delete update e visualizzazione ...

Spero di essere stato chiaro...

per concludere ti mostro la pagina di cui sopra generata con un db avente una tabella "tabella" con semplici campi: ID univoco chiave primaria ed identity poi 3 campi testo con nome cognome ed indirizzo ...

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

spero di essere stato utile!

darkeric Profilo | Senior Member

gentilissimo....

tutto quello che hai scritto è in pratica quello che ho fatto io

con 2 differenze:

1° uso un accessdatasource non un sqldatasource (ma non credo ci siano parecchie differenze)

2° (quello che credo sia il nocciolo del problema) analizzando il mio codice ho notato
che sia fra Itemtemplate e edititemtemplate vengono utilizzati ID diversi per le label

per esempio label1 per itemteplate bindata a cognome e label2 per edititemtemplate bindata a cognome

magari il problema stà li

comunque ti ringrazio per il codice postato
lo confronterò col mio magari ho sbagliato a fare il binding delle label di edit!

ti faccio sapere

grazie ancora!

Gluck74 Profilo | Guru

ciao darkeric,

in teoria quello che ha fatto tu è giusto, ovvero una stringa di update che modifica solo il campo quantità
(update tabella_carrello SET quantita = ? Where Id = ?)

In teoria doveva funzionara anche la prima versione.
Probabilmente c'è qualche problema di accesso al DB o di esecuzione query di modifica. Sembra che stai solo leggendo ma non puoi modificare.

La differenza tra scrivere ? oppure @qta per i parametri, sta nel database utilizzato.
Su sql server devi usare i parametri con nome specifico, su access sono solo numerabili, quindi un valore per ogni ? che metti, in ordine di apparizione

darkeric Profilo | Senior Member

allora....

ho notato che nel codice creatomi automaticamente da Visual Studio, veniva utilizzato Eval anzichè Bind anche per gli EditItemTemplate
Sostituendo Eval Con Bind ho risolto il problema

però mi piacerebbe capire la differenza che c'è fra Eval e Bind, visto che leggendo il tuo codice
nel campo ID viene utilizzato Eval

comunque ho risolo

Grazie

martinez Profilo | Senior Member

Ciao
appunto EVAL è a sola lettura e BIND e bidirezionale ... lettura scrittura ... quindi usando Eval non puoi aggiornare i campi! in ID viene usato apposta EVAL per leggere solo i valori ..

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