2010-07-05 15 views
5

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 que je puisse activer un bouton de formulaire quand un élément de la liste est cochée.Windows C# CheckedListBox Élément vérifié Élément de traitement des événements

Le problème est que j'ai essayé d'utiliser ce qui suit; Mais lorsque je place un point d'arrêt sur l'instruction if, il ne se déclenche jamais lors de la vérification d'un élément dans la liste.

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

+0

Il semble que le Concepteur de fiches contenait un événement ItemCheck incorrectement enregistré. Cela a réglé le problème de base, mais il en est ressorti un nouveau qui semble plus vague dans son contexte. Apparemment, l'état d'un élément coché n'est pas mis à jour tant que ItemCheck n'est pas terminé. C'est mauvais car j'ai besoin du premier élément vérifié pour déclencher le code incorporé. Étant donné que l'état n'est pas mis à jour avant, je perds l'enregistrement immédiat de l'événement. –

Répondre

18

Une astuce Windows Forms standard consiste à retarder l'exécution du code jusqu'à ce que tous les effets secondaires de l'événement soient terminés. Vous retardez l'exécution du code avec la méthode Control.BeginInvoke(). Cela va corriger 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; 
    } 
+0

Je vais certainement regarder dans cette suggestion plus. Il semble être sur la bonne voie sur le papier (écran). :) Merci, Hans. –

+0

Je pense que ce sera le billet que je cherchais. Merci pour votre aide! :) –

+0

Cela a fonctionné pour moi avec une solution de combinaison dodgy_coder: http://stackoverflow.com/questions/545533/delayed-function-calls. Ajoutez simplement la méthode foo à votre code, puis changez cette ligne en this.BeginInvoke (new MethodInvoker (foo), null); et enfin à l'intérieur de foo appeler evalList au lieu de bar(); –

0

Un couple de pièges potentiels. Vraisemblablement, vous avez ajouté l'événement via l'interface graphique de VS.Net pour vous assurer qu'il tombe dans le contrôle. Essayez de cliquer deux fois sur un élément - une fois pour mettre l'élément en surbrillance et à nouveau pour basculer l'état de vérification - si vous souhaitez que l'état de contrôle d'un élément soit activé au premier clic, définissez la propriété «CheckOnClick» sur true.

+0

J'ai déjà la valeur "CheckOnClick" définie sur true. J'ai remarqué que Microsnot semble avoir négligé un élément de conception assez important dans ce cas. Ils vous permettront d'établir ce qui va changer, mais ne déclencheront aucun événement une fois le changement terminé. Je dois dire que ces crétins à MS pourraient nécessiter un débogueur pour un rêve humide. –

0

Je pense que c'est l'événement SelectedIndexChanged mais je vais le confirmer maintenant.

EDIT: l'événement SelectedIndexChanged fonctionne. Mais cela se déclenche indépendamment du fait que la case à cocher a été cochée. Donc, je vérifierais alors l'état vérifié si vous voulez faire cela. Mais en aparté, quand j'ai utilisé l'événement ItemCheck, il s'est déclenché quand j'ai coché la case et pas seulement le texte.

+0

Oui, ItemCheck se déclenche lorsque vous cliquez sur une case à cocher. Le vrai problème est que l'état vhecked de cette case à cocher sera toujours le contraire de ce qu'il était avant de cliquer dessus jusqu'à ce que ItemCheck ait terminé le traitement. Par conséquent, le vrai dilemme de tenter de voir si une case à cocher est effectivement cochée ou décochée en temps réel. c'est à dire.le besoin d'un événement "ItemCheckChanged". –

+0

Alors, ne pouvez-vous pas simplement vérifier le contraire? Si l'événement itemcheck se déclenche et que la case n'est pas cochée, cela signifie qu'il est sur le point d'être vérifié? – spinon

2

Vous pouvez utiliser la propriété NewValue mettre à jour manuellement CheckedItems.Count. Voici le code que j'utilise pour activer uniquement un bouton quand il y a au moins un élément vérifié:

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

Je sais que cela a été répondu depuis longtemps, mais je l'ai trouvé plus facile à manipuler que les événements MouseUp et KeyUp. La propriété CheckedItems.Count est précise 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 j'ai appelé cette méthode 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; 
}