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

Langage C++ Discussion :

[Win32 API C++] Trier une ListView ne trie pas les deux dernieres lignes


Sujet :

Langage C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut [Win32 API C++] Trier une ListView ne trie pas les deux dernieres lignes
    Bonjour,

    J'essaye de trier une listview lorsque l'on click sur la colonne, le tri se fait bien sauf les deux dernieres lignes ne sont pas triées.
    La ListView contient les process en cours avec le pid, protocol, local port, local ip, remote port etc ... un peu comme tcpView.

    le probleme a lieu notemment sur les colonnes pid et localport, en fait elle contienne uniquement des chiffres, et je me demande si ca viens pas de la
    comparaison de nombre sous forme de chaine.

    Avez vous une idée ?

    code notify:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    case LVN_COLUMNCLICK:
    		{			
    			if (notification->nmhdr.hwndFrom != _pDMAppView->getHSelf())
    				return TRUE;
     
    			LPNMLISTVIEW pnmLV = (LPNMLISTVIEW)notification;
    			_pDMAppView->sortListView(pnmLV);
    			break;
    		}
    code de sortlistview: (g_bSortAscending est une variable globale initialisée a false)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void DMAppView::sortListView(LPNMLISTVIEW pnmLV)
    {
    	int nSortColumn = pnmLV->iSubItem;
    	g_bSortAscending = !g_bSortAscending;
     
    	int lParamSort = 1 + nSortColumn;
    	if (!g_bSortAscending)
    		lParamSort = -lParamSort;
    	ListView_SortItemsEx(pnmLV->hdr.hwndFrom, ListViewCompareProc, lParamSort);
    }
    code ListViewCompareProc:
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    int CALLBACK ListViewCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
     
    	bool isAsc = (lParamSort > 0);
    	int column = abs(lParamSort) - 1;
     
    	LVITEM row1;
    	row1.mask =  LVIF_PARAM;
     
    	row1.iItem = (int)lParam1;
    	ListView_GetItem(DMAppView::_hListView, &row1);
     
    	LVITEM row2;
    	row2.mask =  LVIF_PARAM;
     
    	row2.iItem = (int)lParam2;
    	ListView_GetItem(DMAppView::_hListView, &row2);
     
    	ProcessInfos *item1 = (ProcessInfos *)row1.lParam;
    	ProcessInfos *item2 = (ProcessInfos *)row2.lParam;
     
    	switch (column)
    	{
    		case 0:
    		{
    			if (isAsc) return generic_stricmp(item1->_procName.c_str(), item2->_procName.c_str());
    			else return generic_stricmp(item2->_procName.c_str(), item1->_procName.c_str());
    			break;
    		}
                    //PID
    		case 1:
    		{			
    			if (isAsc) return generic_stricmp(item1->_procId.c_str(), item2->_procId.c_str());
    			else return generic_stricmp(item2->_procId.c_str(), item1->_procId.c_str());
    			break;
    		}
     
    		case 2:
    		{
    			if (isAsc) return generic_stricmp(item1->_protocol.c_str(), item2->_protocol.c_str());
    			else return generic_stricmp(item2->_protocol.c_str(), item1->_protocol.c_str());
    			break;
    		}
                   //Local Port
    		case 3:
    		{
    			if (isAsc) return generic_stricmp(item1->_localPort.c_str(), item2->_localPort.c_str());
    			else return generic_stricmp(item2->_localPort.c_str(), item1->_localPort.c_str());
    			break;
    		}
     
    		case 4:
    		{
    			if (isAsc) return generic_stricmp(item1->_localAddr.c_str(), item2->_localAddr.c_str());
    			else return generic_stricmp(item2->_localAddr.c_str(), item1->_localAddr.c_str());
    			break;
    		}
     
    		case 5:
    		{
    			if (isAsc) return generic_stricmp(item1->_remotePort.c_str(), item2->_remotePort.c_str());
    			else return generic_stricmp(item2->_remotePort.c_str(), item1->_remotePort.c_str());
    			break;
    		}
     
    		case 6:
    		{
    			if (isAsc) return generic_stricmp(item1->_remoteAddr.c_str(), item2->_remoteAddr.c_str());
    			else return generic_stricmp(item2->_remoteAddr.c_str(), item1->_remoteAddr.c_str());
    			break;
    		}
     
    		case 7:
    		{
    			if (isAsc) return generic_stricmp(item1->_state.c_str(), item2->_state.c_str());
    			else return generic_stricmp(item2->_state.c_str(), item1->_state.c_str());
    			break;
    		}
     
    		case 8:
    		{
    			if (isAsc) return generic_stricmp(item1->_procPath.c_str(), item2->_procPath.c_str());
    			else return generic_stricmp(item2->_procPath.c_str(), item1->_procPath.c_str());
    			break;
    		}
    	}
    	return 0;
    };
    lparam contient une structure avec ses données

    Merci de votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    C'est ce que je pensait ca venait bien de la comparaison de nombre sous forme de string, j'ai modifie pour les colonnes concernées une comparaison en numerique en convertissant les string en int.

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

Discussions similaires

  1. [Débutant] Comment trier une listview
    Par Oh!Tofocus dans le forum VB.NET
    Réponses: 7
    Dernier message: 04/02/2012, 21h52
  2. Comment trier une listview
    Par samgan dans le forum VB.NET
    Réponses: 0
    Dernier message: 28/04/2010, 19h14
  3. Trier une Listview (Colonne numérique/ Date)
    Par Marc_27 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/04/2009, 18h53
  4. Trier une listview
    Par Gaetch dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/07/2007, 14h36
  5. Réponses: 7
    Dernier message: 28/01/2007, 12h38

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