Uso un timer per risolvere questo problema. Abilita il timer tramite l'evento ItemCheck. Agisci nell'evento Timer's Tick.
Funziona sia che l'elemento sia controllato tramite un clic del mouse o premendo la barra spaziatrice. Approfitteremo del fatto che l'elemento appena selezionato (o deselezionato) è sempre l'elemento selezionato.
L'intervallo del timer può essere minimo 1. Quando viene generato l'evento Tick, verrà impostato il nuovo stato Checked.
Questo codice VB.NET mostra il concetto. Ci sono molte varianti che puoi utilizzare. È possibile aumentare l'intervallo del timer per consentire all'utente di modificare lo stato di controllo su diversi elementi prima di eseguire un'azione. Quindi, nell'evento Tick, eseguire un passaggio sequenziale di tutti gli elementi nell'elenco o utilizzare la relativa raccolta CheckedItems per eseguire l'azione appropriata.
Ecco perché prima disabilitiamo il timer nell'evento ItemCheck. Disabilita quindi Abilita fa riavviare il periodo di intervallo.
Private Sub ckl_ItemCheck(ByVal sender As Object, _
ByVal e As System.Windows.Forms.ItemCheckEventArgs) _
Handles ckl.ItemCheck
tmr.Enabled = False
tmr.Enabled = True
End Sub
Private Sub tmr_Tick(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles tmr.Tick
tmr.Enabled = False
Debug.Write(ckl.SelectedIndex)
Debug.Write(": ")
Debug.WriteLine(ckl.GetItemChecked(ckl.SelectedIndex).ToString)
End Sub
if not item = checkedListBox1.Items[e.Index].ToString()