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

MFC Discussion :

Trier les éléments d'une CListCtrl


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut Trier les éléments d'une CListCtrl
    Bonjour à tous,
    J'ai insérer une listctrl dans ma boite de dialogue, et je veux trier les éléments de cette liste.
    J'ai pris l'exemple sur la msdn mais ça ne marche pas!!
    voici le code que j'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
           // lParamSort contains a pointer to the list view control.
           CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
           CString    strItem1 = pListCtrl->GetItemText(lParam1, 0);
           CString    strItem2 = pListCtrl->GetItemText(lParam2, 0);
     
           LVITEM lvi1;
           ZeroMemory(&lvi1, sizeof(LVITEM));
           lvi1.iItem = lParam1; 
           return strcmp(strItem2, strItem1);
    }
     
    void CMyListCtrl::snip_CListCtrl_SortItems()
    {
       // Sort the list view items using my callback procedure.
       SortItems(MyCompareProc, (LPARAM) this);
    }
    Quand je fais appel à la fonction snip_CListCtrl_SortItems(), le programme n'entre pas dans la fonction de callback: MyCompareProc!!
    Quelqu'un pourrait m'aider sur ce point svp?
    Merci,
    Hanane

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Quel est le tri que tu veux effectuer?
    Je demande ça car si c'est la tri alphabétique classique, c'est automatique.
    Sinon, je te conseille d'utiliser CListCtrl::GetItemText() et d'implémenter toi-même ta fonction de tri.
    Il y a aussi CListCtrl::SortGroup(), mais je ne connais pas cette méthode.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut
    Re,
    Oui c'est ce que j'ai fait. j'ai implementé ma fonction de tri en callback, et j'appelle SortItems en lui donnant la fonction de tri comme paramètre.
    Mais malgré ça le programme n'entre pas dans la fonction de tri.
    Hanane

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Essaie d'invalider ta CListCtrl (myList.Invalidate(); )

  5. #5
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut
    Non j'ai essayé de faire ce que t'as dit mais ca ne marche pas!!
    Hanane

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    bon ben je ne sais pas, désolé, je n'ai jamais utilisé de CListCtrl.
    Sinon, ce que tu peux faire, c'est:
    1/ tu récupère tous les éléments de ta ListCtrl dans une structure à toi (une CStringList par exemple)
    2/ tu supprime tous les éléments de ta listctrl
    3/ tu trie "à la main" ta structure
    4/ tu re-rempli ta listCtrl dans l'ordre

    hope it helps.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut
    Bonjour,

    Dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    Les paramètre lParam1 et lParam2 valent les valeurs définies sur les éléments de la liste grâce à la méthode SetItemData(...)

    As-tu après un InsertItem(...) fait appel à SetItemData(...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // m_ListCtrl est la variable mappée sur le contrôle liste
    // ici ajout de 5 éléments
    ...
    int iPos = 0;
    int iItem = 0;
    static char *Txt[] = {"Jour","Nuit","Avion",Zèbre","Garage"};
    while(iPos < 5)
    {
       iItem = m_ListCtrl.InsertItem(iPos,Txt[iPos]);
       // Initialisation des autres colonnes
       m_ListCtrl.SetItemData(iItem,(DWORD)iItem);
       iPos++;
    }
    Le paramètre lParamSort vaut le paramètre passé à la méthode SortItems(MyCompareProc,this)

  8. #8
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut
    Bonjour,
    En fait, je n'ai pas de setItemDate, donc lparam1 et lparam2 représentent les indices des éléments.
    Mais le problème je crois n'est pas ici, puisqu'il n'entre même pas dans la fonction de tri.
    Est ce que le définition et l'appel de ma fonction de tri sont bons?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 
    SortItems(MyCompareProc, (LPARAM) this);
    Hanane

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut
    A première vue, cela semble correct.
    Je pense qu'il faut quand même définir une valeur à chaque élément grâce à SetItemData(...) mais le fait que tu ne passes pas dans MyCompareProc résulte d'un autre problème

    Je suppose que quelque part dans tes codes, tu fais bien appel à ta méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // CMyListCtrl m_ListCtrl; // Déclaré quelque part
    ...
    m_ListCtrl.snip_CListCtrl_SortItems();

    J'ai déjà implémenté une CMyListCtrl spécifique à un projet
    J'ai déclaré dans le fichier MyListCtrl.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class CMyListCtrl : public CListCtrl
    {
    ...
    static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
     
    public:
    void snip_CListCtrl_SortItems();
    ...
    }
    J'ai implémenté dans le fichier MyListCtrl.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    int CMyListCtrl::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 
    { 
           // lParamSort contains a pointer to the list view control. 
           CMyListCtrl* pListCtrl = (CMyListCtrl*) lParamSort; 
           CString    strItem1 = pListCtrl->GetItemText(lParam1, 0); 
           CString    strItem2 = pListCtrl->GetItemText(lParam2, 0); 
     
           LVITEM lvi1; 
           ZeroMemory(&lvi1, sizeof(LVITEM)); 
           lvi1.iItem = lParam1; 
           return strcmp(strItem2, strItem1); 
    } 
     
    void CMyListCtrl::snip_CListCtrl_SortItems() 
    { 
       // Sort the list view items using my callback procedure. 
       SortItems(MyCompareProc, (LPARAM) this); 
    }
    Au niveau d'une boîte de dialogue
    Fichier MaDlg.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "MyListCtrl.h"
    class MaDlg : public CDialog
    {
       ...
       CMyListCtrl   m_ListCtrl;
       ...
    }
    Fichier MaDlg.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void MaDlg::OnInitDialog()
    {
     ...
     // Garnir la CMyListCtrl
     ...
     // Trier la liste
     m_ListCtrl.snip_CListCtrl_SortItems();
    }

  10. #10
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut
    Oui c'est exactement ce que j'ai fait aussi, mais ca ne marche pas.
    J'ai ajouté le setItemData mais ca n'a rien changé!!
    Hanane

  11. #11
    Membre Expert
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Par défaut
    question bete : SortItems te retourne quoi ??

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut
    As-tu pensé à mapper ton contrôle ListCtrl de ta dialog avec une variable de type CMyListCtrl grâce à l'outils ClassWizard ?

  13. #13
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut
    Normalement SortItems retourn un bool Nonzero si le tri c bien fait sinon 0;
    dans mon cas ca retourne un bool different de 0.

    Pour
    As-tu pensé à mapper ton contrôle ListCtrl de ta dialog avec une variable de type CMyListCtrl grâce à l'outils ClassWizard ?
    Si j'ai bien compris, tu voulais dire avec la classWizard donner à ma liste une variable de type CMyListCtrl. Normalement c'est ce que j'ai fait.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut
    Je pense que tu passes dans la fonction MyCompareProc
    Je viens de faire un programme utilisant CMyListCtrl, et je constate que la méthode de tri donne des résultats incohérents mais je passe dans MyCompareProc.

    Je dois également mettre une valeur à l'élément grâce à SetItemData(...)

    Le problème provient probablement dans la procédure de tri de Windows car quand je TRACE MyCompareProc, j'ai par moment un lParam1 = 0 vaut "Texte1" et à un autre moment le même lParam1 = 0 vaut "Texte2"

    Donc j'ai adapté CMyListCtrl en ajoutant un CStringArray et j'ai un bon résultat

    Fichier MyListCtrl.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class CMyListCtrl : public CListCtrl
    {
    ...
    protected:
    	CStringArray Array; // Mémoire secondaire
     
    	static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
     
    public:
    	void snip_CListCtrl_SortItems();
    	int InsertItem(int iItem,LPCTSTR lpszItem);
    ...
    };
    J'ai écrasé la méthode InsertItem par une version personelle

    Fichier MyListCtrl.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    int CMyListCtrl::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 
    { 
           // lParamSort contains a pointer to the list view control. 
           CMyListCtrl* pListCtrl = (CMyListCtrl*) lParamSort; 
         int i1 = lParam1;
         int i2 = lParam2;
     
       CString strItem1 = pListCtrl->Array[i1];
       CString strItem2 = pListCtrl->Array[i2];
     
       TRACE("lParam1[%d] ... [%d][%s]\n",lParam1,i1,strItem1);
       TRACE("lParam2[%d] ... [%d][%s]\n",lParam2,i2,strItem2);
     
          return strcmp(strItem2, strItem1);
    } 
     
    void CMyListCtrl::snip_CListCtrl_SortItems() 
    { 
       // Sort the list view items using my callback procedure.
       SortItems(MyCompareProc, (LPARAM) this); 
    }
     
     
    int CMyListCtrl::InsertItem(int iItem,LPCTSTR lpszItem)
    {
    	Array.Add(lpszItem); // Ajout du texte dans la mémoire secondaire
    	return CListCtrl::InsertItem(iItem,lpszItem); // Insertion de l'élément dans la CMyListCtrl
    }
    Par exemple dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    void MaDlg::OnInitDialog()
    {
    ...
        int iItem;
     
       m_ListCtrl.InsertColumn(0,"Nom",LVCFMT_LEFT,70);
     
       iItem = m_ListCtrl.InsertItem(0,"Le Seigneur des Anneaux");
       m_ListCtrl.SetItemData(iItem,iItem);
     
       iItem = m_ListCtrl.InsertItem(1,"Boomerang");
       m_ListCtrl.SetItemData(iItem,iItem);
     
       iItem = m_ListCtrl.InsertItem(2,"Cyrano de Bergerac");
       m_ListCtrl.SetItemData(iItem,iItem);
     
       iItem = m_ListCtrl.InsertItem(3,"Les Visiteurs");
       m_ListCtrl.SetItemData(iItem,iItem);
     
       iItem = m_ListCtrl.InsertItem(4,"Alien");
       m_ListCtrl.SetItemData(iItem,iItem);
     
       m_ListCtrl.snip_CListCtrl_SortItems();
    ...
    }
    Donc si je comprends le fonctionnement du tri, il ne faut pas trier directement depuis les éléments de la liste mais depuis une mémoire secondaire (ici le CStringArray) qui n'est jamais triée

  15. #15
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut
    Oui j'ai bien compris ce que tu voulais dire, mais je crois que je suis sur que l'appli n'entre pas dans la fonction de tri car j'ai mis justement pour vérifier un messageBox au début de la fonction et justement ça ne s'affiche pas.
    Hanane

  16. #16
    Membre Expert
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Par défaut
    ajoute les élements par int InsertItem( const LVITEM* pItem );

    et remplie bien le LPARAM lParam; de LVITEM car si tu lis le commentaires :


    lParam
    32-bit value specific to the item. If you use the LVM_SORTITEMS message, the list view control passes this value to the application-defined comparison function. You can also use the LVM_FINDITEM message to search a list view control for an item with a specified lParam value

  17. #17
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut
    C'est ça le problème. Tout ça je l'ai fait et ma liste se rempli correctement et le lParam et bien pris en compte parcequ'il me sert après.
    Donc moi je ne vois pas où est le problème!! je suis perdue

  18. #18
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Salut

    Voici ce que j'ai fait :
    Dans un CListCtrl, j'affiche des noms de fichiers en premier item et leur taille en subItem,

    Pour un tri sur les tailles : j'ai mis en Data les tailles avec un

    res = ((CListCtrl *)GetDlgItem(IDC_LIST1))->SetItem( i, 0,LVIF_PARAM, 0, 0, 0, 0, (LPARAM)taille);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // la fonction de tri
    static int CALLBACK MyCompareProc1(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
        return (DWORD)lParam1 > (DWORD)lParam2;
    }
     
    // appel par 	((CListCtrl *)GetDlgItem(IDC_LIST1))->SortItems(MyCompareProc1, 0);
    // dans ce cas très simple pas besoin de paramètre supplémentaire

    Pour un tri sur les noms de fichier j'ai mis en data le numéro d'insertion de l'item

    res = ((CListCtrl *)GetDlgItem(IDC_LIST2))->SetItem(i, 0,LVIF_PARAM, 0, 0, 0, 0, (LPARAM)i);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // la fonction de tri
    static int CALLBACK MyCompareProc2(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
       CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
     
       CString    strItem1 = pListCtrl->GetItemText(lParam1, 0);
       CString    strItem2 = pListCtrl->GetItemText(lParam2, 0);
     
       return stricmp(strItem1, strItem2);
    }
     
    // appel par 	((CListCtrl *)GetDlgItem(IDC_LIST1))->SortItems(MyCompareProc2, (LPARAM)((CListCtrl *)GetDlgItem(IDC_LIST1)));
    // ici il faut l'adresse du CListCtrl pour pouvoir extraire les info
    Pas besoin de faire réaffficher le CListCtrl !

    Ton erreur est je pense ici :
    SortItems(MyCompareProc, (LPARAM) this);
    Ce n'est pas this, mais le CListCtrl qu'il faut passer.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 91
    Par défaut
    Bonjour a tous.

    Je remonte le sujet car j'ai essayé vaux differents methode et j'ai le meme resultat a chaque fois:

    En fait j'ai toujours LPARAM lParam1, LPARAM lParam2 ui sont égaux tous les deux a 1.

    il ne le change donc jamais rien...

    je vous met mon code pour la fonction ci dessus :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void CBiblioBDDlg::OnColumnclickListBd(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    	long m_type_tri = (LPARAM) pNMListView->iSubItem;
    	((CListCtrl *)GetDlgItem(IDC_LIST_BD))->SortItems((PFNLVCOMPARE)MyCompareProc,(LPARAM)((CListCtrl *)GetDlgItem(IDC_LIST_BD)));
    	*pResult = 0;
    }
     
     
    int CBiblioBDDlg::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 
    { 
    	CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
     
       CString    strItem1 = pListCtrl->GetItemText(lParam1, 0);
       CString    strItem2 = pListCtrl->GetItemText(lParam2, 0);
     
       return stricmp(strItem1, strItem2);
     
    }
    J'ai aussi essyé la methode de MYClistCtrl

    merci d'avance

  20. #20
    Membre très actif
    Profil pro
    Développeur indépendant
    Inscrit en
    Août 2004
    Messages
    374
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur indépendant
    Secteur : Transports

    Informations forums :
    Inscription : Août 2004
    Messages : 374
    Par défaut tri
    en fait, c'est la procédure du clistctrl qui t'envoie sur la procédure de tri les deux items à trier.
    c'est donc à toi de determiner
    1) la nature des items et donc la procédure de tri.
    2) à lui renvoyer -1,0 ou 1, selon la relation entre les deux items.
    un exemple qui marche trés bien..
    http://www.codeproject.com/listctrl/...select=1468514
    un excellent, que j'utilise tout le temps..

    je te mets à titre d'exemple la routine de tri callback appellée par le composant lors d'une demande de tri.
    tu remarqueras que je l'ai un peu customisé pour supporter des entrées de comparaisons assez diverses..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    int CALLBACK CSortListCtrl::CompareFunction( LPARAM lParam1, LPARAM lParam2, LPARAM lParamData )
    {
    	CSortListCtrl* pListCtrl = reinterpret_cast<CSortListCtrl*>( lParamData );
    	ASSERT( pListCtrl->IsKindOf( RUNTIME_CLASS( CListCtrl ) ) );
     
    	ItemData* pid1 = reinterpret_cast<ItemData*>( lParam1 );
    	ItemData* pid2 = reinterpret_cast<ItemData*>( lParam2 );
     
    	ASSERT( pid1 );
    	ASSERT( pid2 );
     
    	LPCTSTR pszText1 = pid1->arrpsz[ pListCtrl->m_iSortColumn ];
    	LPCTSTR pszText2 = pid2->arrpsz[ pListCtrl->m_iSortColumn ];
     
    	CString deb1;
    	CString deb2;
    	deb1 = pid1->arrpsz[ 0];
    	deb2 = pid2->arrpsz[ 0];
    	if (pListCtrl->listesomme)
    	{
    		if (deb1=="")
    			return -1;
    		if (deb2=="")
    			return -1;
    	}
     
    	ASSERT_VALID_STRING( pszText1 );
    	ASSERT_VALID_STRING( pszText2 );
     
    	if( IsNumber( pszText1 ) )
    		return pListCtrl->m_bSortAscending ? NumberCompare( pszText1, pszText2 ) : NumberCompare( pszText2, pszText1 );
    	else if( IsDate( pszText1 ) )
    		return pListCtrl->m_bSortAscending ? DateCompare( pszText1, pszText2 ) : DateCompare( pszText2, pszText1 );
    	else if (IsFloat(pszText1))
    		return pListCtrl->m_bSortAscending ? FloatCompare( pszText1, pszText2 ) : FloatCompare( pszText2, pszText1 );
    	else
    		// text.
    		return pListCtrl->m_bSortAscending ? lstrcmp( pszText1, pszText2 ) : lstrcmp( pszText2, pszText1 );
    }
    à noter que on arrive à cette fonction seulement si on a lancé au prealable
    cette ligne de code qui appelle la procédure de tri intégrée..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VERIFY( SortItems( CompareFunction, reinterpret_cast<DWORD>( this ) ) );
    comment y arriver.??
    intercepter le click sur le bandeau du controleur..
    void CSortListCtrl::OnColumnClick( NMHDR* pNMHDR, LRESULT* pResult )
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    const int iColumn = pNMListView->iSubItem;

    // if it's a second click on the same column then reverse the sort order,
    // otherwise sort the new column in ascending order.
    Sort( iColumn, iColumn == m_iSortColumn ? !m_bSortAscending : TRUE );

    *pResult = 0;
    }


    void CSortListCtrl::Sort( int iColumn, BOOL bAscending )
    {
    m_iSortColumn = iColumn;
    m_bSortAscending = bAscending;

    // show the appropriate arrow in the header control.
    m_ctlHeader.SetSortArrow( m_iSortColumn, m_bSortAscending );

    VERIFY( SortItems( CompareFunction, reinterpret_cast<DWORD>( this ) ) );
    }
    pour plus d'infos détaillées sur le sujet, tu peux aussi chercher le msdn
    HOWTO: Sort Items in a CListCtrl in Report View
    vala..
    pratiquement, prends le lien que je t'ai indiqué, ce sera une bonne base et au moins tu auras quelque chose qui marche pour t'exercer..
    aprés, toutes les customisations sont possibles..
    amuses toi bien!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Trier les éléments d'une datagrid (RAI MVVM)
    Par SIC83 dans le forum Silverlight
    Réponses: 4
    Dernier message: 11/02/2012, 17h26
  2. Réponses: 2
    Dernier message: 29/10/2008, 11h13
  3. Trier les éléments d'une boite de dialogue OpenDialog
    Par Gengis_Khan dans le forum Composants VCL
    Réponses: 0
    Dernier message: 17/05/2008, 10h16
  4. Trier les élément d'une ListBox
    Par gluc86 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 17/01/2008, 14h58
  5. Trier les éléments d'une DropDownList
    Par Med80 dans le forum C#
    Réponses: 6
    Dernier message: 18/04/2007, 19h44

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