69 votes

Comment sélectionner un élément dans un ListView de manière programmatique ?

J'essaie de sélectionner le premier élément d'un ListView de manière programmatique, mais il ne semble pas avoir été sélectionné. J'utilise le code suivant :

if (listView1.Items.Count > 0)
    listView1.Items[0].Selected = true;

En fait, j'ai déjà eu ce problème, mais je ne me souviens plus comment j'ai réussi à le résoudre !

88voto

Cody Gray Points 102261

Très probablement, l'article es est sélectionné, mais vous ne pouvez pas le savoir car un autre contrôle a le focus. Il existe plusieurs façons de résoudre ce problème, en fonction de la conception de votre application.

  1. La solution la plus simple est de mettre l'accent sur le bouton ListView en premier lieu lorsque votre formulaire est affiché. L'utilisateur met généralement l'accent sur les contrôles en cliquant dessus. Cependant, vous pouvez également spécifier par programme quel contrôle recevra le focus. Une façon de le faire est de définir l'indice de tabulation du contrôle à 0 (la valeur la plus basse indique le contrôle qui aura le focus initial). Une deuxième possibilité est d'utiliser la ligne de code suivante dans le fichier de formulaire Load ou immédiatement après avoir défini l'événement Selected propriété :

    myListView.Select();

    Le problème avec cette solution est que l'élément sélectionné n'apparaîtra plus en surbrillance lorsque l'utilisateur mettra le focus sur un autre contrôle de votre formulaire (comme une zone de texte ou un bouton).

  2. Pour résoudre ce problème, vous devez définir l'option HideSelection propriété de la ListView à False. Ainsi, l'élément sélectionné sera restent en évidence même lorsque la commande perd le focus.

    Lorsque le contrôle a le focus, l'arrière-plan de l'élément sélectionné sera peint avec la couleur de surbrillance du système. Lorsque le contrôle pas ont le focus, l'arrière-plan de l'élément sélectionné sera peint dans la couleur système utilisée pour le texte grisé (ou désactivé).

    Vous pouvez définir cette propriété soit au moment de la conception, soit par le biais du code :

    myListView.HideSelection = false;

42voto

VikciaR Points 1758
if (listView1.Items.Count > 0)
{
    listView1.Items[0].Selected = true;
    listView1.Select();
}

Les éléments de la liste n'apparaissent pas sélectionnés à moins que le contrôle n'ait le focus (ou que vous ayez défini l'attribut HideSelection à false)

4 votes

Les extraits de code sans explications ne comptent pas comme des réponses.

6 votes

Mais il a répondu à la question et c'est explicite :-)

11 votes

Non, ce n'est pas explicite. La seule façon d'y voir clair est de comprendre que les éléments de la liste n'apparaissent pas sélectionnés à moins que le contrôle n'ait le focus (ou que vous ayez défini l'attribut HideSelection à false). Et si vous le saviez, vous n'auriez pas à poser cette question en premier lieu. Plus important encore, cela se casse lorsque l'utilisateur clique ailleurs dans le formulaire. Soudain, l'élément sélectionné ne semble plus l'être ! L'auteur de la question qui se contente de copier et de coller le code de votre réponse ne saura pas ce qui s'est passé, et il reviendra poser une autre question.

9voto

Jonathan Wood Points 26443

Je sais que c'est une vieille question, mais je pense que c'est la réponse définitive.

listViewRamos.Items[i].Focused = true;
listViewRamos.Items[i].Selected = true;
listViewRemos.Items[i].EnsureVisible();

S'il y a une chance que le contrôle n'ait pas le focus mais que vous voulez forcer le focus sur le contrôle, vous pouvez ajouter la ligne suivante.

listViewRamos.Select();

Pourquoi Microsoft n'a pas simplement ajouté un SelectItem() La méthode qui fait tout ça pour vous me dépasse.

9voto

pro Points 347

Je pense que le problème et la solution ont été décrits par cody gray ! J'ai une note supplémentaire.

Veuillez vérifier le focus de l'élément de listview spécifié (et du contrôle !). Je pourrais définir le focus et la sélection avec les lignes de code suivantes :

this.listView1.Items[1].Selected = true;
this.listView1.Items[1].Focused = true;

Mais le contrôle ciblé était une condition !

1 votes

La mise au point sur un élément individuel de la liste n'est nécessaire que lorsque vous avez multiple éléments sélectionnés. Dans ce cas, tous les arrière-plans des éléments sélectionnés seront mis en évidence, mais un seul d'entre eux aura le "rectangle de mise au point" en pointillés. Vous pouvez déterminer lequel de ces éléments est sélectionné en définissant l'attribut Focused propriété comme vous l'avez fait ici. Lorsqu'un seul élément du ListView est sélectionné, il aura toujours le focus lorsque son contrôle hôte aura le focus.

4voto

N.Ramos Points 586
        int i=99;//is what row you want to select and focus
        listViewRamos.FocusedItem = listViewRamos.Items[0];
        listViewRamos.Items[i].Selected = true;
        listViewRamos.Select();
        listViewRamos.EnsureVisible(i);//This is the trick

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X