Dire che ho perso mezza giornata per risolvere questo "semplice" problema a molti sembrerà impossibile eppure ho trovato molti sviluppatori che hanno riscontrato lo stesso problema. L'evento ItemCheck di un ListView viene generato quando un elemento che ha un checkbox viene selezionato o deselezionato.
Lo stesso evento si genera però quanto si aggiungono gli elementi al ListView magari per poterli visualizzare. Se ad esempio si vuole salvare il valore del checkbox su un database e recuperare i nuovi dati, si potrebbero generare dei loop.
Il problema si può risolvere in modo abbastanza semplice (dopo che l'ho scoperto): nel momento in cui si esegue il binding del listview è necessario rimuovere da codice l'evento ItemCheck e riassociarlo quando si è terminato il binding. Se ListView1 è il controllo presente sul form le righe di codice da scrivere sono le seguenti:
1: ' rimuove l'evento dalla gestione temporaneamente
2: RemoveHandler ListView1.ItemCheck, AddressOf ListView1_ItemCheck
3:
4: ' codice che popola il ListView
5:
6: ' riassocia l'evento itemcheck al controllo
7: AddHandler ListView1.ItemCheck, AddressOf ListView1_ItemCheck
Eh eh... semplice!