IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

TListView : changez l'ordre des colonnes ne change pas celui des subItems ?


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut TListView : changez l'ordre des colonnes ne change pas celui des subItems ?
    J'ai réalisé une TListViewen vsReport où les colonnes sont activables/désactivables et l'ordre peut être changé par glissé/déposé (comme sous l'Explorateur Windows quoi)

    Mais je tombe sur un comportement bizarre : quand on change l'ordre des colonnes, Delphi ajuste aussi tout seul l'affichage des éléments de la ListView. Mais cela n'est que visuel, car les subItems sont toujours selon l'ordre d'origine et il devient forcément impossible de s'y retrouver.

    Pour donner un exemple :
    * On part avec les colonnes "A" et "B"
    * Par glissé/déposé on interverti leur ordre (ceci est alors reflèté dans TlistView.Columns dont l'ordre à changé)
    * On créé alors un élément TListItem dans la liste, le texte dans Caption apparait alors dans la colonne "A" (qui est maintenant la seconde à l'écran) et le texte de subItem[0] apparait dans la colonne "B" (donc dans la première colonne visuellement)

    Cela peut sembler de prime abord pratique, le problème c'est que quand l'utilisateur à réorganisé quelques colonnes, ajouté et supprimés quelques unes, je n'ai plus aucun moyen de savoir a quelle colonne correspond le caption ou subitem[x] d'un ListItem. Même en vidant avec ListView.Clear et en repeuplant le contenu, ou bien en supprimant toutes les colonnes pour les reconstruires, l'ordre d'affichage est toujours défait !

  2. #2
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Points : 1 577
    Points
    1 577
    Par défaut
    Salut,

    apparemment le problème n'est pas simple à gérer

    Il faut utiliser la gestion de l'évènement TCustomListView::OnColumnDragged
    Dans l'aide, ils conseillent :
    Conseil*: Pour identifier les colonnes de manière unique afin que vous puissiez les reconnaître après qu'elles aient été repositionnées, utilisez la propriété Tag de la colonne liste.

    En clair, on met '1' dans la propriété Tag de la 1ère colonne, '2' dans la 2ème etc...

    Par contre je n'est pas trouvé de moyen de savoir dans quel ordre se retrouve graphiquement les colonnes après déplacement par l'utilisateur. S'il n'y a pas moyen de connaitre cette info, le problème semble insoluble

    Cependant, Lorsqu'on utilise la gestion de l'évènement TCustomListView::OnCustomDrawSubItem, on a moyen de connaitre quel 'SubItem' est en cours d'affichage. Et on testant la propriété Tag de celui-ci, on peut connaitre dans quel ordre les colonnes s'affichent. A mon avis c'est balèze à gérer.

    J'espère qu'il existe une autre solution

    @+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bon finalement j'ai trouvé un "truc" pour contourner le problème (qui a lui même généré un autre problème d'ailleurs).

    Apparemment le fait de détruire toutes les colonnes (ListView.Columns.Clear) et de les reconstruires annule bien le "désordre" généré par le drag'n drop, et les subItem recommencent à s'afficher dans l'ordre numérique auquel on s'attend. (en gros la ListView est réinitialisée) Cela offre donc une solution détournée pour forcer une remise à zéro de l'ordre d'affichage.

    Le problème c'est que si on modifie l'objet ListView.Column dans l'évènement "onColumnDragged", et bien les noms de colonnes ne sont pas dessinés ! Du coup pas moyen de forcer la réinitialisation à cet endroit.

    Du coup ma solution, pour ceux que ça intéresse (je doit pas être le seul à permettre d'ajouter/supprimer/réorganiser les colonnes d'une ListView) :
    * Créer un évènement à soit dans la form
    * Dans cet évènement, détruires les colonnes et le contenu de la ListView, et tout refaire tel que ça doit être
    * Dans l'évènement OnColumnDragged, noter le nouvel ordre des colonnes (forcément, pour pouvoir le refaire à l'identique après), et à la fin s'envoyer le message avec PostMessage (c'est important de pas utiliser SendMessage).

    De cette façon la ListView est reconstruire et réinitialisée, mais uniquement après la fin complète des opérations de drag'n drop et donc sans problème d'affichage.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par rtg57
    Par contre je n'est pas trouvé de moyen de savoir dans quel ordre se retrouve graphiquement les colonnes après déplacement par l'utilisateur. S'il n'y a pas moyen de connaitre cette info, le problème semble insoluble
    Oui je pense qu'il doit y avoir une table interne au composant qui lie les colonnes (selon quel critère ?) aux subItem de sorte qu'en cas de drag'n drop les subItem sont affichés dans le même ordre que les colonnes (et donc dans le désordre d'un point de vue numérique).

    Il est vrai que pour des colonnes statiques (même nombre, même intitulés, on ne change que l'ordre d'affichage) cela simplifie la vie, mais dès qu'on permet d'en ajouter ou supprimer cela devient ingérable.

    Enfin bon mon "bricolage" semble marcher à merveille à défaut d'être très propre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/11/2010, 15h39
  2. Mapper des colonnes et non pas des lignes
    Par trotters213 dans le forum Hibernate
    Réponses: 4
    Dernier message: 30/04/2008, 15h25
  3. GridBagLayout ne tiens pas compte des colonnes
    Par Anonymouse dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 13/12/2007, 18h51
  4. dimensions des colonnes ne varient pas
    Par piotrr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 21/07/2007, 09h28
  5. Réponses: 7
    Dernier message: 22/09/2006, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo