Vous pouvez utiliser l' ItemCheck
événement si vous vérifiez également le nouvel état de l'élément sur lequel l'utilisateur clique. Ceci est disponible dans l'événement args, comme e.NewValue
. Si NewValue
est coché, incluez l'élément actuel avec la collection appropriée dans votre logique:
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
List<string> checkedItems = new List<string>();
foreach (var item in checkedListBox1.CheckedItems)
checkedItems.Add(item.ToString());
if (e.NewValue == CheckState.Checked)
checkedItems.Add(checkedListBox1.Items[e.Index].ToString());
else
checkedItems.Remove(checkedListBox1.Items[e.Index].ToString());
foreach (string item in checkedItems)
{
...
}
}
Comme autre exemple, pour déterminer si la collection sera vide une fois que cet élément est (non) vérifié:
private void ListProjects_ItemCheck(object sender, ItemCheckEventArgs args)
{
if (ListProjects.CheckedItems.Count == 1 && args.NewValue == CheckState.Unchecked)
// The collection is about to be emptied: there's just one item checked, and it's being unchecked at this moment
...
else
// The collection will not be empty once this click is handled
...
}
if not item = checkedListBox1.Items[e.Index].ToString()
Il y a beaucoup d'articles liés à StackOverflow à ce sujet ... En plus de la solution de Branimir , en voici deux plus simples:
Exécution retardée sur ItemCheck (également ici ):
Utilisation de l'événement MouseUp :
Je préfère la première option, car la seconde entraînerait des faux positifs (c'est-à-dire tirant trop souvent).
la source
The check state is not updated until after the ItemCheck event occurs
. Un événement différent ou une solution de contournement non arbitraire serait une bonne OMI.Je l'ai essayé et ça marche:
la source
ItemChecked
événement, et personne n'a jamais répondu qu'il n'existait pas.ItemChecking
,ItemChecked
, vous pouvez alors utiliser celui- ci un. Mais si un seul est implémenté (ItemCheck
), il fait les choses correctement, c'est-à-dire déclenche l'événement avant que la valeur ne soit vérifiée avec une nouvelle valeur et un index fournis en paramètres. Quiconque souhaite l'événement «après le changement» peut simplement utiliser ce qui précède. Si vous suggérez quelque chose à Microsoft, suggérez un nouvel événementItemChecked
, sans changer celui existant: voir la réponse deDériver
CheckedListBox
et mettre en œuvrela source
Bien que ce ne soit pas idéal, vous pouvez calculer les CheckedItems à l'aide des arguments transmis à l'
ItemCheck
événement. Si vous regardez cet exemple sur MSDN , vous pouvez déterminer si l'élément nouvellement modifié a été coché ou non, ce qui vous laisse dans une position appropriée pour travailler avec les éléments.Vous pouvez même créer un nouvel événement qui se déclenche après la vérification d'un élément, ce qui vous donnerait exactement ce que vous vouliez si vous le souhaitiez.
la source
Après quelques tests, j'ai pu voir que l'événement SelectedIndexChanged est déclenché après l'événement ItemCheck. Conservez la propriété CheckOnClick True
Meilleur codage
la source
Cela fonctionne, je ne sais pas à quel point c'est élégant!
la source
Je ne sais pas si cela s'applique, mais je voulais utiliser une liste de contrôle pour filtrer les résultats. Donc, comme l'utilisateur a vérifié et décoché les éléments, je voulais que la liste affiche \ masquer les éléments.
J'avais des problèmes qui m'ont conduit à ce post. Je voulais juste partager comment je l'ai fait sans rien de spécial.
Remarque: j'ai CheckOnClick = true mais cela fonctionnerait probablement toujours sans
L'événement que j'utilise est " SelectedIndexChanged "
l'énumération que j'utilise est " .CheckedItems "
Cela donne les résultats auxquels je pense que nous pouvons nous attendre. Si simplifié, cela revient à ...
la source
En supposant que vous souhaitiez conserver les arguments de
ItemCheck
mais être notifié après la modification du modèle, cela devrait ressembler à ceci:Où
CheckedItemsChanged
pourrait être:la source
J'utilise une minuterie pour résoudre ce problème. Activez le minuteur via l'événement ItemCheck. Agissez dans l'événement Timer's Tick.
Cela fonctionne que l'élément soit vérifié via un clic de souris ou en appuyant sur la barre d'espace. Nous profiterons du fait que l'élément qui vient d'être coché (ou non coché) est toujours l'élément sélectionné.
L'intervalle de la minuterie peut être aussi bas que 1. Au moment où l'événement Tick est déclenché, le nouvel état Vérifié sera défini.
Ce code VB.NET montre le concept. Il existe de nombreuses variantes que vous pouvez utiliser. Vous souhaiterez peut-être augmenter l'intervalle du minuteur pour permettre à l'utilisateur de modifier l'état de vérification de plusieurs éléments avant d'agir. Ensuite, dans l'événement Tick, effectuez un passage séquentiel de tous les éléments de la liste ou utilisez sa collection CheckedItems pour prendre les mesures appropriées.
C'est pourquoi nous désactivons d'abord le minuteur dans l'événement ItemCheck. Désactiver puis Activer entraîne le redémarrage de la période d'intervalle.
la source
Dans un comportement normal, lorsque nous vérifions un élément, l'état de vérification de l'élément changera avant que le gestionnaire d'événements ne soit déclenché. Mais un CheckListBox a un comportement différent: le gestionnaire d'événements est déclenché avant que l'état de vérification de l'élément change et cela rend difficile la correction de nos travaux.
À mon avis, pour résoudre ce problème, nous devrions différer le gestionnaire d'événements.
la source
Je l'ai essayé et ça marche:
déterminer par index de la liste.
la source