Forms.ListView, SelectedIndexChanged et clignotement
MyXiLo
Messages postés57Date d'inscriptionvendredi 21 mai 2004StatutMembreDernière intervention28 juillet 2006
-
27 avril 2006 à 19:08
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 2013
-
28 avril 2006 à 23:39
Bonsoir.
L'évènement SelectedIndexChanged se déclenche lorsque la sélection dans un ListView change. Le problème est que lorsqu'un Item est déjà selectionné et que l'utilisateur en sélectionne un autre, SelectedIndexChanged est appelé deux fois: d'abord parcequ'aucun élément n'est plus sélectionné (transition) puis quand l'élément de destination est sélectionné.
En fonction de la position de l'Item sélectionné dans le ListView je grise(Enabled=false) ou non des boutons. SelectedIndexChanged s'appelant deux fois consécutivement, mes boutons clignotent (je Enabled=false tout quand rien n'est sélectionné puis Enabled=true pour certains boutons lorsqu'il y a un Item dans la sélection), ce qui est véritablement pénible.
J'aimerais savoir si quelqu'un sait comment faire (sans trop chager le code, car je n'ai aucune envie de passer par le controle du clavier et des fleches, etc.) pour détecter lorsque la sélection change véritablement.
Tu peux aussi passer par les événement du clique.
(Si on a cliquer sur un item ou non)
private void TaListView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (TaListView.GetItemAt(e.X, e.Y) == null)
{
// On a cliquer a coté d'un item
}
else
{
// On a cliquer sur un item
// Donc comme un SelectedIndexChanged
[...]
}
}
Kenji
<hr width="100%" size="2">
Merci de cliquer sur "Réponse acceptée" si une réponse vous convient.
MyXiLo
Messages postés57Date d'inscriptionvendredi 21 mai 2004StatutMembreDernière intervention28 juillet 2006 27 avril 2006 à 20:36
Bidou > Et bien c'est ce que je fais, mais lors de la transition (aucun Item n'est selectionné mais un va bientôt l'être) aucun Item n'est dans la sélection, ce qui "fausse" le test puisqu'en vérité un Item est sélectionné mais pas actuellement. C'est ce qui fait clignoter mes boutons.
Charles Racaud > Le soucis c'est que l'utilisateur peut aussi changer la sélection avec les flèches du clavier. Ca m'embete de vérifier le clavier et la souris mais je ne vais pas avoir le choix je crois...
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 27 avril 2006 à 21:09
Hum, je ne vois pas trop le problème!
Si par exemple, la condition c'est que le text d'un item commence par le caractère "3" pour disabler certain bouton, on ferait comme ça (et ça ne clignote pas) :
if (
this.listView1.SelectedItems.Count > 0)
{
if (
this.listView1.SelectedItems[0].Text[0] ==
'3')
{
MyXiLo
Messages postés57Date d'inscriptionvendredi 21 mai 2004StatutMembreDernière intervention28 juillet 2006 27 avril 2006 à 22:19
J'ai un ListView contenant plusieurs Items. Un Item est déjà selectionné.L'utilisateur clique sur un autre Item. SelectedIndexChanged se lance et le ListView.Items.Count=0 (car l'Item précédent n'est plus sélectionné et le suivant ne l'est pas encore), je fais mes tests et je définis Button.Enabled=false. SelectedIndexChanged est appelé de nouveau(car l'Item d'arrivée est selectionné, sans intervention supplémentaire du programme ou de l'utilisateur) avec ce coup ci ListView.Items.Count=1, je fais mes tests mais cette fois ci la réaction est Button.Enabled=true.
Avec le changement de sélection mon bouton passe successivement de non autorisé à autorisé, ce qui le fait clignoter.
Ta solution ne fait effectivement pas clignoter les boutons si la fonction qui les contient n'est appelée qu'une fois. En revance si elle est appelé deux fois consécutives et que les réactions sont différentes alors les boutons vont clignoter.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 27 avril 2006 à 22:54
J'ai bien compris ton problème, mais le morceau de code que je t'ai mis plus haut ne provoque plus ce clignotement chez moi. Il me manque peut-être quelque chose ?
Tu pourrais éventuellement poster un morceau de code...
MyXiLo
Messages postés57Date d'inscriptionvendredi 21 mai 2004StatutMembreDernière intervention28 juillet 2006 28 avril 2006 à 10:25
Bonjour,
En vérité j'avais mal lu ton code et effectivement il n'y a pas de clignotement. Pour ce qui est de mon code, je n'effectue pas uniquement le test lorsqu'il y a un Item dans la sélection mais aussi lorsqu'il n'y en a.
Nikoui
Messages postés794Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention19 août 200813 28 avril 2006 à 10:30
Bidou, tu rajoute un test "si la premiere lettre est un 3"... mais le problème de l'auteur du post (si j'ai bien compris), c'est que le seul test qu'il veux faire c'est : "un item est sélectionné ?". (autrement dit, execute ton code sur un treeview dont tous les items commencent par 3 pour reproduire le meme probleme avec ton code...).
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 28 avril 2006 à 11:56
Euh, je ne sais pas si je suis bête ou quoi, mais je vois pas le problème lol.
Finalement, c'est quoi le but? De disabler un bouton lorsque le premier élément d'un ListView est sélectionné ? Si oui, on fait comme ça (et ça ne clignote pas) :
Nikoui
Messages postés794Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention19 août 200813 28 avril 2006 à 12:57
Si j'ai bien compris ce qui est demandé :
Si au moins un item est sélectionné, button = enabled.
Si aucun item sélectionné, button = disbled.
Or, si un item est sélectioné, et que tu en sélection un autre, il se passe :
- déselection de l'item précédement sélectionné (button disabled)
- sélection de l'item nouvellement sélectionné (button enabled)
Le but est donc de ne pas passer par la case "disabled"....
Nikoui
Messages postés794Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention19 août 200813 28 avril 2006 à 13:34
Et bien MyXiLo... je crains qu'il n'y est pas de solution "simple"...
Tu n'a aucun moyen de savoir si tu es dans le cas "plus de sélection", ou bien "plus de sélection, le temps de reselectionné le suivant"...
Après tu peux éventuellement surcharger le changement de sélection au clavier + à la souris (un peu compliqué, juste pour ça...) ... ou utiliser un timer (mais dans ce cas ton IHM donnera l'impression de "ramer" lors de la désélection)...
Ah, si ! une solution simple : racourci la durée de tes traitements s'il y en a à ce moment là, et utilise une machine plus puissante :) ! Sur ma machine de dev, le clignotement est quasiment imperceptible... (bon ok, ce n'est pas une solution non plus...)