none
Se déplacer dans une ListView avec les flèches Up/Down RRS feed

  • Question

  • Bonjour à tous,

    J’ai une ListvView qui contient 3 colonnes dont 2 sont visibles.

    La colonne 0 contient une icône, la 1 est de type int et la 2 est de type string.

    J’ai un Event Click qui selon la colonne qui sur laquelle on clique, fait les actions suivantes :

    S’il s’agit de la colonne 0 l’icône change. S’il s’agit de la colonne 2 des données apparaissent dans des TextBox qui sont sur le côté.

    L’Event click fonctionne parfaitement avec le click souris mais pas si on change de ligne à l’aide des flèches Up and Down.

    J’ai donc essayé l’Event SelectedIndexChanged, mais la réaction aux flèches Up/Down n’est pas toujours détectée et en plus j’arrive toujours sur la ligne 1 et cela ne bouge plus. Est-ce dû à l’Event Click ?

    J’ai également essayé KeyDown, KeyPress mais pas de bons résultats.

    Voici  une partie du code :

    private void lviAccountList_SelectedIndexChanged(object sender, EventArgs e)
            {
                ListView.SelectedListViewItemCollection collection = this.lviAccountList.SelectedItems;
    
                string accountId = string.Empty;
    
                if (collection.Count > 0)
                {
                    foreach (ListViewItem item in collection)
                    {
                        accountId = Convert.ToString(item.SubItems[1].Text);
                    }
    
                    ContextSession.WorkingAccount = AccountEntity.GetById(Convert.ToInt32(accountId), ContextSession.WorkingUser.Id);
                    tbResult.Text = Convert.ToString(ContextSession.WorkingAccount.Id);
                    LoadSelectedAccount(ContextSession.WorkingAccount.Id);
                }
            }

    Merci pour votre aide.

    lundi 9 mars 2015 22:05

Réponses

  • Bonjour,

    Chez moi ce déplacement s'effectue seulement avec les flèches up/down sans ajouter aucun code. Pour détecter la touche des boutons up/down par code, essayez l'exemple suivant: "C# Winforms Listview - How can you take programmatic control of the up and down arrow keys on the keyboard?".

    Merci de nous tenir au courant.

    Cordialement,

    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    • Marqué comme réponse paintbox00 vendredi 13 mars 2015 22:36
    vendredi 13 mars 2015 14:47
    Modérateur
  • Bonjour,

    petite correction par rapport à mon code.  Il faut faire un row - pour la touche Up et row + 1 pour la touche Down sinon, il y a toujours un décalage. Row garde la valeur de l'élément actuellement sélectionné.

    Le code complet donne donc:

     private void lviAccountList_KeyDown(object sender, KeyEventArgs e)
            {
                lviAccountList.BeginUpdate();
                int accountId = 0;
                int row = -1;
                switch (e.KeyCode)
                {
                    case Keys.Up:
                        // Select previous row
                        row = Convert.ToInt32(this.lviAccountList.SelectedItems[0].Index) - 1;
                        break;
                    case Keys.Down:
                        // Select next row
                        row = Convert.ToInt32(this.lviAccountList.SelectedItems[0].Index) + 1;
                        break;
                    default:
                        break;
                }
    
                if (row > -1)
                {
                    accountId = Convert.ToInt32(lviAccountList.Items[row].SubItems[1].Text);
                    ContextSession.WorkingAccount = AccountEntity.GetById(Convert.ToInt32(accountId), ContextSession.WorkingUser.Id);
                    LoadSelectedAccount(ContextSession.WorkingAccount.Id);
                }
                lviAccountList.Items[row].Selected = true;
                lviAccountList.EndUpdate();
            }

    • Marqué comme réponse paintbox00 samedi 14 mars 2015 10:41
    samedi 14 mars 2015 10:41

Toutes les réponses

  • Bonsoir paintbox00,

    Pouvez-vous préciser la manière de laquelle les flèches Up/Down doivent fonctionner dans votre programme? 

    Cordialement,

    Nina



    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 10 mars 2015 19:40
    Modérateur
  • Bonjour,

    merci pour votre aide.

    Ce que j'essaie de faire c'est lorsque j'enfonce la touche Up (flèche ver le haut) et si une ligne de ma listview est sélectionnée je monte d'une ligne. Si j'enfonce la touche Down (flèche vers le bas) je descend d'une ligne.

    Pour l'instant j'ai 4 éléments dans ma listview (0,1,2,3). Si je me mets sur la ligne 3 (donc la dernière) et que j'appuie sur la flèche vers le haut(logiquement pour monter d'une ligne), pas de réaction. J'ai mis un breackpoint et je ne rentre pas dans ma méthode. Par contre si j'appuie sur la flèche vers le bas je monte mais à la ligne 1 alors que je devrais aller de la ligne 3 à la ligne 2 .Dans ce cas je rentre dans ma méthode.

    Une fois sur cette ligne 1 je n'ai plus de réactions (je ne rentre plus dans ma méthode).

    Merci 

    mardi 10 mars 2015 20:12
  • Bonjour,

    Chez moi ce déplacement s'effectue seulement avec les flèches up/down sans ajouter aucun code. Pour détecter la touche des boutons up/down par code, essayez l'exemple suivant: "C# Winforms Listview - How can you take programmatic control of the up and down arrow keys on the keyboard?".

    Merci de nous tenir au courant.

    Cordialement,

    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    • Marqué comme réponse paintbox00 vendredi 13 mars 2015 22:36
    vendredi 13 mars 2015 14:47
    Modérateur
  • Bonjour,

    cela fonctionne à présent. J'avais je pense testé l'Event KeyPress mais sans succès.

    Il ne faut pas oublier de  donner le focus à la nouvelle ligne sur laquelle on se trouve sinon le déplacement marche un fois puis plus moyen de se déplacer dans le listview.

    Voici donc ce que cela donne. Si cela peut en aider d'autres.

    private void lviAccountList_KeyDown(object sender, KeyEventArgs e)
            {
                ListView.SelectedListViewItemCollection collection = this.lviAccountList.SelectedItems;
                int accountId = 0;
                int row = -1;
                switch (e.KeyCode)
                {
                    case Keys.Up:
                    case Keys.Down:
                        row = Convert.ToInt32(this.lviAccountList.SelectedItems[0].Index);
                        break;
                    default:
                        break;
                }
    
                if (row > -1)
                {
                    accountId = Convert.ToInt32(lviAccountList.Items[row].SubItems[1].Text);
                    ContextSession.WorkingAccount = AccountEntity.GetById(Convert.ToInt32(accountId), ContextSession.WorkingUser.Id);
                    LoadSelectedAccount(ContextSession.WorkingAccount.Id);
                    // Give focus to the new selected row
                    lviAccountList.FocusedItem = lviAccountList.Items[row];
                }
            }

    Encore un grand merci pour votre !

    Cordialement

    • Marqué comme réponse paintbox00 vendredi 13 mars 2015 22:36
    • Non marqué comme réponse paintbox00 samedi 14 mars 2015 10:41
    vendredi 13 mars 2015 22:35
  • Bonjour,

    petite correction par rapport à mon code.  Il faut faire un row - pour la touche Up et row + 1 pour la touche Down sinon, il y a toujours un décalage. Row garde la valeur de l'élément actuellement sélectionné.

    Le code complet donne donc:

     private void lviAccountList_KeyDown(object sender, KeyEventArgs e)
            {
                lviAccountList.BeginUpdate();
                int accountId = 0;
                int row = -1;
                switch (e.KeyCode)
                {
                    case Keys.Up:
                        // Select previous row
                        row = Convert.ToInt32(this.lviAccountList.SelectedItems[0].Index) - 1;
                        break;
                    case Keys.Down:
                        // Select next row
                        row = Convert.ToInt32(this.lviAccountList.SelectedItems[0].Index) + 1;
                        break;
                    default:
                        break;
                }
    
                if (row > -1)
                {
                    accountId = Convert.ToInt32(lviAccountList.Items[row].SubItems[1].Text);
                    ContextSession.WorkingAccount = AccountEntity.GetById(Convert.ToInt32(accountId), ContextSession.WorkingUser.Id);
                    LoadSelectedAccount(ContextSession.WorkingAccount.Id);
                }
                lviAccountList.Items[row].Selected = true;
                lviAccountList.EndUpdate();
            }

    • Marqué comme réponse paintbox00 samedi 14 mars 2015 10:41
    samedi 14 mars 2015 10:41