Gridview accesso ai campi per update DB

lunedì 16 novembre 2009 - 02.21

ma_di Profilo | Junior Member

Ciao a tutti,
il problema mi sta consumando....
Lavoro in Visual Basic, VisualStudio 2008; ho una Gridview, popolata con un datasource che prende i dati da una vista in SQL2005.
L'utente, tramite il pulsante di modifica (presente su ogni riga) accede all'editing dei campi visualizzati ( sulla riga ).
Finita l'operazione, tramide il pulsante Aggiorna (update) conclude la sessione di edit, e di conseguenza i dati modificati devono andare nel db.
Non so se ho sbagliato qualche impostazione, ma attraverso l'update del datasource non posso aggiornare perchè si genera un errore ( troppi campi da aggiornare con la vista), per cui ho deciso di intercettare il click sul pulsante aggiorna della riga, aprire una connessione con il db e aggiornare.
Non so quante prove ho fatto, ma proprio non mi riesce di accedere ai campi modificati per mandarli nel DB.
Qualcuno sa darmi una dritta per favore? Sono quasi all'esaurimento!!

Grazie e ciao.

FrancescoGuadagno Profilo | Senior Member

L'errore esattamente qual è? "troppi campi da aggiornare nella vista"?... La vista non ha update.. credo che il procedimento sia in effetti sbagliato

ma_di Profilo | Junior Member

Innanzi tutto ti ringrazio per l'interessamento.
Una cosa che non ho scritto ( questa notte era molto tardi...) è che sono veramente all'inizio con ASP.NET, e come capita sempre si cerca di imparare facendo....
Già sono rimasto perplesso nel costruire la query di update, non sapendo cosa mettere vicino al simbolo di =; ho provato ad aggiungere @ seguito dal nome dell'ID del campo nel datagrid.... ma si genera l'errore di definizione Must declare the scalar variable "@COGNOME".
Per cui vorrei lasciare perdere l'update dell'SQLDatasource e gestire l'aggiornamento da codice VB; ma proprio non mi riesce di accedere ai campi nella riga editata della gridview.
Come ho detto lavoro in Visualbasic, provenendo da VB6, e credo di essermi un po' perso nei meandri dei vari oggetti e classi.

Ciao e grazie.
Antonio

FrancescoGuadagno Profilo | Senior Member

>Innanzi tutto ti ringrazio per l'interessamento.
nessun problema!
>Già sono rimasto perplesso nel costruire la query di update,
>non sapendo cosa mettere vicino al simbolo di =; ho provato ad
>aggiungere @ seguito dal nome dell'ID del campo nel datagrid....
>ma si genera l'errore di definizione Must declare the scalar
>variable "@COGNOME".
>Per cui vorrei lasciare perdere l'update dell'SQLDatasource e
>gestire l'aggiornamento da codice VB; ma proprio non mi riesce
>di accedere ai campi nella riga editata della gridview.

Allora, stai passando da un argomento all'altro.. mi sa che ti tocca mettere un pò d'ordine. ;)
Tanto per cominciare la @ viene utilizzata per utilizzare i parametri all'interno della query.
Ad esempio:
update tabella1 set campo1=@valoreCampo1 where id = @idriga
serve ad indicare che essenzialmente nella tua quey ci sono due parametri. "@valoreCampo1" e "@idriga".

Se tu provi ad eseguire la query così com'è in sql server management studio chiaramente avrai un errore, e l'errore che ottieni via codice è l'errore che si verifica a livello sql.

Il tuo problema quindi diventa essenzialmente assegnare dei valori ai parametri. Puoi partire da questo link http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlparameter(VS.80).aspx per capire più o meno come utilizzare il tutto.

Se però tu utilizzi SQLDataSource, tali meccanismi sono insiti nel controllo: http://msdn.microsoft.com/it-it/library/z72eefad(VS.80).aspx

Se invece esci fuori dalla logica del datasource, e quindi vuoi recuperare i valori modificati e occuparti poi tu di tutto (cosa utilissima specie se sei agli inizi), allora devi:
1) gestire la RowCommand
2) fare uno switch sul tuo comando di update
3) recuperare l'istanza controllo che ha generato l'evento e quindi risalire alla riga di edit
4) recuperare i valori di tutti i controlli compilati dall'utente
5) salvare

ma_di Profilo | Junior Member

Grazie per le dritte; vedrò di studiare un po' di più prima per poter fare dopo

1) gestire la RowCommand
2) fare uno switch sul tuo comando di update
3) recuperare l'istanza controllo che ha generato l'evento e quindi risalire alla riga di edit
4) recuperare i valori di tutti i controlli compilati dall'utente
5) salvare

anche se, ora come ora, è proprio questa parte che non so come fare..
Ciao.

FrancescoGuadagno Profilo | Senior Member

>1) gestire la RowCommand

Un modo è associare ad un qualsiasi controllo all'interno della tua GridView, l'attributo "CommandName"

<asp:Button runat=server ID=btnSubmit Text="Save" CommandName="Update" />

Attenzione che alcuni nomi (Update, Sort, Cancel, Edit, Select..) sono di sistema, ovvero li puoi utilizzare tranquillamente ma generano altri eventi esposti dalla GridView. Puoi tranquillamente inserire "Update" o "Salva".

>2) fare uno switch sul tuo comando di update
protected void gv1_RowCommand(object sender, GridViewCommandEventArgs e) { switch (e.CommandName) { case "Salva": { } break; } }

>3) recuperare l'istanza controllo che ha generato l'evento e
>quindi risalire alla riga di edit

GridViewRow rowInEditing = ((GridViewRow)((Button)sender).Parent.Parent);
Questo è solo un modo. Se vogliamo il più "strutturale" che ti fa capire come dal sender (il tuo button Salva) risali al primo parent (una GridViewCell) e poi al secondo parent, una GridViewRow. Quello che hai fatto è letteralmente recuperare la riga della Griglia in cui è stato premuto il pulsante Salva.

Un altro modo è accedere direttamente alla riga in stato "Edit"

GridViewRow rowInEditing = gv1.Rows[gv1.EditIndex];

questo modo però funziona solo se all'edit ci sei arrivato mediante la pressione su un pulsante con command name "Edit".

>4) recuperare i valori di tutti i controlli compilati dall'utente
TextBox txtUnaTextBoxModificata = (TextBox)rowInEditing.FindControl("txtNome");

>5) salvare
Successivamente devi semplicemente salvare su DB.


Ripeto, questo è solo un modo, il più "strutturale" che ti consente di capire tante cose importanti, se stai cominciando.

ma_di Profilo | Junior Member

Grazie grazie grazie!!!
Sei stato veramente di grandissimo aiuto
In un attimo si è spalancato il mondo ( beh... insomma...)
Anche se gli esempi erano in c li ho adattati ( esercizio anche questo).
Finalmente ho raggiunto ste benedette celle!!!

Grazie ancora.
Antonio.
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