2009-03-31 7 views
0

La propriété ListView winform ne semble pas avoir un moyen facile d'annuler l'événement SelectedIndexChanged. Je ne vois pas non plus un événement SelectedIndexChanging.Annulation de SelectedIndexChanged dans WinForm ListView

Le code est ma tentative. Cependant, la lumière est partie et je me demandais si je devais colorier la sélection ou s'il y avait une meilleure façon d'annuler. _prevSelectedIndex est l'index de la dernière sélection. Je veux que le surlignage revienne à la sélection précédente.

lvSearchResults.SelectedIndexChanged -= new EventHandler(lvSearchResults_SelectedIndexChanged); 
lvSearchResults.SelectedIndices.Clear(); 
lvSearchResults.SelectedIndices.Add(_prevSelectedIndex); 
lvSearchResults.Items[_prevSelectedIndex].Selected = true; 
lvSearchResults.SelectedIndexChanged += new EventHandler(lvSearchResults_SelectedIndexChanged); 

Répondre

0

Tant que vous avez désactivé multiselect vous ne devriez pas avoir à appeler SelectedIndices.Clear() Selectedndices.Add (..) ainsi que des articles [_prevSelectedIndex] .selected = true; - Ce dernier accomplira le même résultat.

Je crois que vous ajoutez également une liste sans cesse croissante de gestionnaires d'événements. Pour supprimer un gestionnaire d'événements, vous devez stocker une instance du délégué puis supprimer cette instance; - = new EventHandler (...) ne va pas supprimer le gestionnaire.

+0

La liste n'a pas de propriété selectedIndex. Lorsque Multiselect est faqlse, la collection SelectedIndices ne devrait en avoir qu'une. Que le multiselect soit éteint ou allumé, le comportement est le même. La façon dont j'ai les gestionnaires (enlever et ajouter) fonctionne bien. Sinon, le hanlder sera dans ... – Abdu

+0

... boucle infinie à cause de l'instruction 'Selected = true'. – Abdu

0

La meilleure et la plus simple est d'avoir une propriété booléenne que vous définissez comme true lorsque vous ne voulez pas que l'événement se déclenche. Dans l'événement SelectedIndexChange, vous testez pour voir si vous devez autoriser l'événement à continuer à renvoyer d'autres retours. Vérifiez mon code. Le code ci-dessous se comporte de la même manière.

 //somewhere on top 
    private bool dontFireEvent = false;   

    //somewhere else 
    dontFireEvent = true; 
    treeView1.SelectedNode = treeView1.Nod.... bla bla //event won't fire 
    dontFireEvent = false; 

    //within the event code 
    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 
    { 
     if (!dontFireEvent) 
      ProcessLogin(); 
    } 
Questions connexes