Eento RowCommand GridView

martedì 05 aprile 2011 - 09.36
Tag Elenco Tags  C#  |  .NET 2.0  |  .NET 3.0  |  .NET 3.5  |  Windows Server 2008 R2  |  Windows XP  |  Visual Studio 2008  |  SQL Server 2008 R2  |  Internet explorer 8.0  |  Internet Explorer 7.0  |  Internet Explorer 6.0  |  Chrome  |  Opera  |  Safari  |  Firefox  |  Javascript  |  CSS 2.1  |  XHTML 1.0

jackie1977 Profilo | Newbie

Un saluto a tutti,

Eccomi quì a chiedervi lumi a fronte di questa, per me strana situazione.

Ho due GridView all'interno di un UpdatePanel: la prima visualizza un elenco di clienti da associare ad un utente; la seconda visualizza l'elenco dei clienti associati all'utente.
La prima gridView ha una colonna con un "pulsantino" ADD che scatena l'evento RowCommand nel quale eseguo una istruzione di INSERT in un DB che non fa altro che associare il cliente selezionato all'utente. Effettuato l'inserimento rieseguo un DataBind delle due GridView creando sostanzialmente l'effetto visivo di un record che viene "trasferito" da una tabella all'altra.

Il problema è questo. Con Internet Explorer il problema non si manifesta, mentre con gli altri browser che ho testato (FF, e Chrome) noto che, probabilmente a casua del DataBind() che richiamo per riaggiornare le gridView l'evento RowCommand rimane "ATTIVO" e viene scatenato 2 volte, con il risultato che l'istruzione di INSERT che viene chiamata due volte (l'istruzione di INSERT inserisce una coppia di chiavi ID_CLIENTE, ID_UTENTE e per tale ragione mi viene generato un errore di tentato inserimento di una chiave già esistente)

Quindi; al di là del controllo che potrei fare per verificare l'esistenza di un record su DB, come potrei fare per evitare che l'evento RowCommand venga eseguito una sola volta? (per me è impornate, eseguito l'inserimento, riaggiornare le gridView).

Secondo voi perchè l'evento viene richiamato nuovamente?

Essendo una applicazione web su INTERNET devo poter garantire il corretto funzionamento su più Browser?

Grazie mille

Gianluca

balfaz Profilo | Expert

iniziamo da un piccolo particolare, sè usi una libreria con tecnologia AJAX cosi particolare, di facile utilizzo ma anche di cosi poca compatibilità come quella di asp.net ti troverai con questi tipi di inconvenienti (attenzione a me asp.net me piace e conosco anche la potenza di questo linguaggio che per me è uno dei migliori).

Prova a fare questo
Protected Sub MioControllo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click

modifica cosi, rimuove il handles
Protected Sub MioControllo_Click(ByVal sender As Object, ByVal e As System.EventArgs)

facci sapere
Dove troverai sempre una mano disposta ad aiutarti è nell'estremo del tuo proprio braccio

jackie1977 Profilo | Newbie

Balfaz, grazie mille per la tua risposta.

Non posso rimuovere l'Handles perchè non sviluppo in VB, ma in C# ed il metodo "incriminato" è già nella forma da te suggerita:

protected void GwClienti_RowCommand(object sender, GridViewCommandEventArgs e)

In verità ho trovato una soluzione, ma non so se sia corretta ed in ogni caso non fuga i miei dubbi iniziali. Ad ogni modo, riscrivendo il metodo "OnInitializeRequest" di AJAX ASP.NET controllo per mezzo della seguente istruzione "args.get_postBackElement().id" chi è che esegue la richiesta asincrona.

Mi sono accorto che INDIPENDENTEMENTE dal browser la richiesta viene SEMPRE eseguita due volte. La seconda volta però il metodo "args.get_postBackElement().id" ritorna come valore una stringa vuota. Allora, furbescamente ho abortito la rischiesta asincrona così: "args.set_cancel(true);"

In questo modo ho risolto mio problema e l'applicazione funziona (BENE!), sebbene ancora non riesca a capire per la rischiesta asincrona venga eseguita due volte.

Attendo lumi a riguardo

Nel frattempo grazie ancora del suggerimento

Gianluca

motogpdesmo16 Profilo | Senior Member

jackie per caso il pulsantino è un un templatefield con all'interno un controllo ImageButton?
Ricordo che tempo fa ebbi lo stesso tipo di problema (praticamente l'evento veniva scatenato due volte al click), in uno scenario pressochè identico (doppia gridiview in un update panel) e, dopo aver letteralmente passato una notte intera a fare prove varie, ricerche qua e la su internet, era un bug identificato da microsoft che consigliava di sostituire l'oggetto ImageButton con una normale colonna di tipo text e all'interno aggiungerci il codice html di anchor + image. Praticamente qualcosa di simile a questo
<a href="..."><image src="..."/></a>

A mo' di prova, senza compromettere l'uso della tua pagina, puoi effettuare un test.
Tuttavia stasera, appena ho il codice in mano, provo a postarti il frammento che ti potrebbe interessare.

jackie1977 Profilo | Newbie

motogpdesmo16, grazie mille anche a te per il suggerimento

Avevo avuto il presentimento fosse un bug...

No, non ho un templateField con un ImageButton, ma, addirittura, un ButtonField (suppongo che a logica il principio sia esattamente lo stesso).
In ogni caso il tuo è un suggerimento molto interessante per cui proverò senza'ltro la soluzione da te proposta.

Inoltre, ora che mi sovviene, un problema simile avviene con le Dropdoenlist associate con le cascadingDropDoenlist quando si trovano in un updatePanel e si ha necessità di gestire l'evento indexChange della dropDownList...

Davvero grazie

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