Je développe actuellement une application de fenêtre qui utilise des boîtes à chèques 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é lorsqu'un élément est coché afin que je puisse activer un bouton de formulaire lorsque n'importe quel élément de liste est coché.
problème est que j'ai essayé d'utiliser ce qui suit; p> mais lorsque je définit un point d'arrêt sur la déclaration IF, il ne tire jamais lors de la vérification d'un élément dans la liste de liste. P> suis-je en train de faire quelque chose de mal ici ? p> p>
5 Réponses :
Un couple de potentiel de gotchas. Vous avez probablement ajouté l'événement via l'interface graphique vs.net pour vous assurer qu'elle devient plongée dans le contrôle. Essayez de cliquer sur un élément deux fois - une fois pour donner la mise au point d'élément et encore pour basculer l'état de chèque - si vous souhaitez qu'un élément ait son état de chèque basculé au premier clic, définissez la propriété "ChrononClick" sur true. P>
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 plutôt important dans ce cas. Ils vous laisseront établir ce qui va changer, mais ne pas déclencher des événements une fois que le changement est terminé. Je dois dire que ces abrutis de MS pourraient nécessiter un débogueur pour un rêve humide.
Je pense que c'est l'événement sélectionnéExchangeedExchanged, mais je vais confirmer maintenant. P>
Edit: L'événement sélectionnéExchangeed fonctionne fonctionne. Mais cela est en train de tirer, que la case à cocher ait été vérifiée. Donc, je vérifierais alors l'état vérifié si vous voulez le faire. P>
Mais comme mis de côté lorsque j'ai utilisé l'événement ItemCheck, il a été incendié lorsque je vérifiais la case à cocher et non seulement le texte. P>
Oui, l'itemCheck se déclenche lorsque vous cliquez sur une case à cocher. Le vrai problème est que l'état de la caisse VHecké de cette case à cocher sera toujours le contraire de ce qu'il était avant de cliquer dessus jusqu'à la fin du traitement de l'itemCheck. Par conséquent, le vrai dilemme de tentative de voir si une case à cocher est en réalité vérifiée ou non contrôlée en temps réel. C'est-à-dire la nécessité d'un événement "itemCheckChanged".
Alors alors ne peux-tu pas vérifier le contraire? Si l'événement ItemCheck est en train de tirer et la case à cocher n'est pas cochée, cela signifie qu'il est sur le point d'être vérifié correctement?
Un astuce Standard Windows Forms est de retarder le code d'exécution jusqu'à ce que tous les effets secondaires soient terminés. Vous retardez le code d'exécution 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; }
Je vais très certainement regarder cette suggestion plus. Il semble être sur la bonne voie sur papier (écran). :) Merci, Hans.
Je pense que ça va être le billet que je cherchais. Merci pour votre aide! :)
Cela a fonctionné pour moi avec une solution dodgy_coder combinée: Stackoverflow.com/questions/545533/Delayed-fonction-Calls. Ajoutez simplement la méthode FOO à votre code, puis modifiez cette ligne en cette page.beginInvoke (nouvelle méthodeInvoker (FOO), NULL); et enfin à l'intérieur de Foo Call Evallist au lieu de bar ();
L'événement sélectionnéExchangeedExchanged n'est pas tiré si la case à cocher est basculée avec la touche SPACE.
Vous pouvez utiliser la propriété NEWVALUE pour mettre à jour manuellement checkeDitems.count. C'est le code que j'utilise pour activer uniquement un bouton lorsqu'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); }
Je sais que cela a été répondu il y a longtemps, mais j'ai trouvé plus facile de gérer simplement les événements MouseUp et Keyup. La propriété CheckeDitems.count est exacte lorsque ces événements sont tirés. Comme ils font tous les deux la même chose, j'ai créé une méthode pour atteindre le travail et appelé cette méthode à partir de 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; }
Il semble que le concepteur de formulaire ait un événement IdemCheck intégré là-bas. Cela fixe le problème de base, mais maintenant un nouveau a produit qui semble plus vague dans son contexte. Apparemment, un état d'élément vérifié n'est pas mis à jour avant la fin de l'itemCheck. C'est mauvais car j'ai besoin du premier élément vérifié pour déclencher le code énoncé. Étant donné que l'État n'est pas mis à jour avant la suite, je perds l'enregistrement immédiat de l'événement de vérification de l'article.