Windows C # CheckedListBox Gestion des événements d’éléments cochés

Je développe actuellement une application Windows qui utilise CheckedListBoxes pour certains aspects du programme. Un problème que j’ai rencontré est que j’ai essayé de trouver quel événement est déclenché quand un élément est vérifié afin de pouvoir activer un bouton de formulaire lorsqu’un élément de la liste est coché.

Le problème est que j’ai essayé d’utiliser ce qui suit:

private void clbAvailMods_ItemCheck(object sender, ItemCheckEventArgs e) { if(e.NewValue == CheckState.Checked) { btnInstall.Enabled = true; } } 

mais lorsque je définis un point d’arrêt sur l’instruction if, il ne se déclenche jamais lors de la vérification d’un élément de la liste.

Est-ce que je fais quelque chose de mal ici?

Une astuce Windows Forms standard consiste à retarder l’exécution du code jusqu’à ce que tous les effets secondaires d’événements soient terminés. Vous retardez l’exécution du code avec la méthode Control.BeginInvoke (). Cela résoudra votre problème:

  private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) { this.BeginInvoke(new MethodInvoker(evalList), null); } private void evalList() { bool any = false; for (int ix = 0; ix < checkedListBox1.Items.Count; ++ix) { if (checkedListBox1.GetItemChecked(ix)) { any = true; break; } } btnInstall.Enabled = any; } 

Vous pouvez utiliser la propriété NewValue pour mettre à jour manuellement CheckedItems.Count. C’est le code que j’utilise pour n’activer un bouton que si au moins un élément est coché:

 private void checkedListBoxProds_ItemCheck(object sender, ItemCheckEventArgs e) { this.buttonGenerar.Enabled = ((this.checkedListBoxProds.CheckedItems.Count + (e.NewValue == CheckState.Checked ? 1 : -1)) > 0); } 

Deux pièges potentiels. Vous avez probablement ajouté l’événement via l’interface graphique VS.Net pour vous assurer qu’il est inséré dans le contrôle. Essayez de cliquer deux fois sur un élément – une fois pour activer le focus et à nouveau pour basculer l’état de contrôle – si vous souhaitez que l’état de contrôle d’un élément soit basculé au premier clic, puis définissez la propriété “CheckOnClick” sur true.

Je pense que c’est l’événement SelectedIndexChanged, mais je vais confirmer pour le moment.

EDIT: L’événement SelectedIndexChanged fonctionne. Mais cela se déclenche que la case soit cochée ou non. Je voudrais donc vérifier l’état coché si vous voulez le faire.

Mais en passant, lorsque j’ai utilisé l’événement ItemCheck, il s’est déclenché lorsque j’ai coché la case et pas seulement le texte.

Je sais que cela a été répondu il y a longtemps, mais il m’a été plus facile de gérer uniquement les événements MouseUp et KeyUp. La propriété CheckedItems.Count est exacte lorsque ces événements sont déclenchés. Comme ils font tous les deux la même chose, j’ai créé une méthode pour le travail et l’ai appelée à partir des deux gestionnaires d’événements.

 private void clbFolders_KeyUp(object sender, KeyEventArgs e) { Update(); } private void clbFolders_MouseUp(object sender, MouseEventArgs e) { Update(); } private void Update() { btnDelete.Enabled = clbFolders.CheckedItems.Count > 0; }