Question

Comment déclencher par programmation l'événement SelectedIndexChanged d'un ListView?

J'ai prévu que le premier élément de mon ListView soit automatiquement sélectionné après que l'utilisateur a terminé une action donnée. Le code existe déjà dans l'événement SelectedIndexChanged pour mettre en surbrillance l'élément sélectionné. Non seulement l'élément n'est pas mis en surbrillance, mais un point d'arrêt défini dans SelectedIndexChanged n'est jamais atteint. De plus, un Debug.WriteLine ne produisant pas de sortie, je suis donc plutôt certain que cet événement ne s'est pas déclenché.

Le code suivant ne parvient pas à déclencher l'événement:

listView.Items[0].Selected = false;
listView.Items[0].Selected = true;
listView.Select();
Application.DoEvents();

L'appel de méthode supplémentaire .Select () a été inclus pour une bonne mesure. ;) La désélection (.Selected = false) a été incluse pour désélectionner le ListViewItem dans la collection .Items juste au cas où il aurait pu être sélectionné par défaut et le paramétrer sur 'true' n'aurait donc aucun effet. L’appel 'Application.DoEvents ()' est une autre méthode de dernier recours.

Le code ci-dessus ne devrait-il pas provoquer le déclenchement de l'événement SelectedIndexChanged?

Je dois mentionner que l'événement SelectedIndexChanged est correctement déclenché lorsqu'un élément est sélectionné via le clavier ou la souris.

Était-ce utile?

La solution

Le désélectionner en le définissant sur false ne déclenchera pas l'événement, mais en le définissant sur true.

    public Form1 ()
    {
        InitializeComponent();
        listView1.Items[0].Selected = false; // Doesn't fire
        listView1.Items[0].Selected = true; // Does fire.
    }

    private void listView1_SelectedIndexChanged (object sender, EventArgs e)
    {
        // code to run
    }

Vous pourriez avoir autre chose à faire. Quel événement utilisez-vous votre code de sélection?

Autres conseils

Pourquoi ne pouvez-vous pas déplacer le code qui se trouve actuellement dans la méthode de votre gestionnaire d'événements vers une méthode pouvant être appelée à partir de la position d'origine et également à partir de votre code?

Quelque chose comme ça:

class Foo
{
    void bar(Object o, EventArgs e)
    {
        // imagine this is something important
        int x = 2;
    }

    void baz()
    {
        // you want to call bar() here ideally
    }
}

serait refactored à ceci:

class Foo
{
    void bar(Object o, EventArgs e)
    {
        bop();
    }

    void baz()
    {
        bop();
    }

    void bop()
    {
        // imagine this is something important
        int x = 2;
    }
}

Si vous créez une classe dérivée de ListView , vous pouvez appeler la méthode protégée OnSelectedIndexChanged . Cela déclenchera l'événement SelectedIndexChanged .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top