ListView, evento "ItemSelectionChanged" e bloccaggio nuova selezione

mercoledì 25 luglio 2007 - 10.39

S4turno Profilo | Junior Member

Ho una listView dove ogni volta che viene selezionato un item vengono caricate dei dati nella form. Questi dati sono modificabili, e nel caso siano modificati senza prima salvarli e si tenti di selezionare un nuovo item, appare una MessageBox (YesNoCancel) con la classica interrogazione sul da farsi. Nel caso venga selezionato Cancel, dovrei bloccare la nuova selezione e lasciar selezionato l'attuale.
Per fare questo uso l'evento "ItemSelectionChanged" della ListView, che viene scatenato ogni volta che c'è un cambio dello stato della selezione e quindi viene scatenato due volte ogni volta che selezione un nuovo oggetto: la prima volta per la deselezione del precedente, la seconda volta per la selezione del nuovo.
Allo scatenarsi dell'evento posso chiaramente sapere in quale dei due stati sono. Quindi se ho due items (A,B), e voglio passare da A a B (tenendo presente che se dall'evento "ItemSelectionChanged" forzo una nuova selezione, lo riscateno ricorsivamente), la procedura sarebbe:

ItemSelectionChanged - deselezione A: { nessuna azione }
ItemSelectionChanged - selezione B: { Se dati modificati forzo la selezione ad A
ItemSelectionChanged - deselezione B: { nessuna azione}
ItemSelectionChanged - seleziono A { nessuna azione }
}

Il problema è che quando seleziono A, dato che i dati sono nello stato modificato, viene nuovamente riforzata la selezione, innestando un ciclo che teoricamente dovrebbe essere infinito, mentre praticamente si ripete 4 volte (2 se seguo il codice con qualche break point). Sto cercando soluzioni facendo varie prove, come disassociare l'evento alla mia funzione quando seleziono B, oppure usare una variabile booleana per scegliere se forzare la selezione o meno, ma o alla fine del percorso il risultato è che nessun item è selezionato, oppure mi appare più volte la MessageBox (o entrambe le cose!).


Qualcuno si è mai trovato con un problema simile?
Spero di essere riuscito a spiegarmi...

Ciao

Ciciu Profilo | Senior Member

Ciao.
Avrei un'idea da proporTi, magari è una fesseria, ma non è detto. Beh, comunque ci provo.

PotresTi mettere il Tuo dettaglio (ovvero tutti i campi editabili) in un panel.
PotresTi aggiungere una variabile booleana a livello di Form che faccia da semaforo : sfruttando l'evento Enter del panel dovresTi settarla a FALSE, in quanto non ci sono variazioni.
La variazione di un campo dovrebbe porla a TRUE.
L'evento Leave del panel potrebbe verificare lo stato della variabile e, se è a True, chiedere conferma delle variazioni.
Se ok, aggiorni l'Item della ListView. Se no, aggiorni i dati con quelli dell'item corrente. Se è cancel, metti il focus su un campo qualsiasi dei Tuoi, il che ti obbliga a stare nel panel.
Nel frattempo, la modifica di uno dei tuoi campi, dovrebbe anche disabilitare il Listview, altrimenti l'utente potrebbe comunque spostarsi....
Ciao - Fabio
Fabio G
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