Forms.ListView, SelectedIndexChanged et clignotement

MyXiLo Messages postés 57 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 juillet 2006 - 27 avril 2006 à 19:08
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 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.

Merci d'avance.
Thomas.

15 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 avril 2006 à 19:38
Salut,
Pourquoi ne pas faire tout simplement un test (dans l'eventHandler) pour savoir si un item est sélectionné, du genre :

if(
this.listView.SelectedItems.Count > 0)
MessageBox.Show(
"Selected");

<hr>
[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319
0
Utilisateur anonyme
27 avril 2006 à 19:46
Salut,

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.
0
MyXiLo Messages postés 57 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 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...

Merci pour vos réponses.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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')
   {
     
this.button1.Enabled =
false;
     
this.button2.Enabled =
false;
   }
  
else
   {
     
this.button1.Enabled =
true;
     
this.button2.Enabled =
true;
   }
}

<hr>
[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MyXiLo Messages postés 57 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 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.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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...

<hr>
[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319
0
MyXiLo Messages postés 57 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 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.

if (this.ListView.SelectedItems.Count == 1)
{
if(this.ListView.SelectedItems[0].Index > 0)
{
this.Button.Enabled=true;
}
else
{
this.Button.Enabled=false;
}
}
else
{
this.Button.Enabled=false;
}

Lorsque l'utilisateur clique sur des Items qui ne sont pas en première position il y a clignotement. Désolé de m'être mal expliqué.
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
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...).
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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) :

if
(
this.listView.SelectedItems.Count == 1)
{
  
this.button.Enabled =
this.listView.SelectedItems[0].Index > 0;
}

<hr>
[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
28 avril 2006 à 12:54
rajoute :

else
{
this.button.Enabled = false;
}
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
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"....
0
MyXiLo Messages postés 57 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 juillet 2006
28 avril 2006 à 13:28
Bidou > Le problème est tout à fait ce que décrit Nikoui.

Nikoui > Une solution à ce problème me permettrait de résoudre le mien. (Merci pour l'explication clarifiée)
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
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...)
0
MyXiLo Messages postés 57 Date d'inscription vendredi 21 mai 2004 Statut Membre Dernière intervention 28 juillet 2006
28 avril 2006 à 13:45
Je pense que je vais devoir passer par la "surveillance" du clavier et la souris car je ne peux vraiment pas laisser cela comme ça.

Merci beaucoup pour vos réponses.
Thomas.
0
Rejoignez-nous