Tout d'abord veuillez m'excuser si je ne fournis pas de script complet.
Ma question fait appel à votre expérience de codeur.
Soit un tableau à deux dimensions $g_aArray
un tableau $g_aCol_Name avec le nom des colonnes
une liste Enum avec le numéro des colonnes $g_eCol_xxx
une listview $idListview
des combobox $idCombo_XXX
$g_sSep = '|'
Si par exemple ma combo $idCombo_Etat propose les valeurs Ouvert et Fermé, je ne veux qu'afficher les lignes dont l'Etat est "Ouvert" si je sélectionne "Ouvert" dans la combo.
Je souhaite avoir l'affichage le plus rapide des données de mon tableau dans la listview après avoir sélectionné un filtre à l'aide de mes combobox.
Pour gérer le(s) filtre(s), j'utilise ce code :
If GUICtrlRead(Eval('idCombo_' & $sCombo)) <> '' And GUICtrlRead(Eval('idCombo_' & $sCombo)) <> ' ' Then ; Existe et différent de l'espace ' '
$sFilters &= '$g_aArray[$iRow][' & Eval('g_eCol_' & $sCombo) & '] = "' & GUICtrlRead(Eval('idCombo_' & $sCombo)) & '" And '
EndIf
Next
$sFilters &= True ; Si tous les filtres sont à blanc, alors il faut au moins un filtre pour que le if fonctionne
Pour afficher les lignes, j'ai testé trois codes possibles.
1. Avec GUICtrlCreateListViewItem(), le traitement avec un filtre X s'exécute en 660 ms :
2. Avec GUICtrlCreateListViewItem() et en fixant en dur les colonnes utilisées, le traitement avec un filtre X s'exécute en 450 ms :
If Execute($sFilters) Then
GUICtrlCreateListViewItem($g_aArray[$iRow][0] & $g_sSep & $g_aArray[$iRow][1] & $g_sSep & $g_aArray[$iRow][2] & $g_sSep & $g_aArray[$iRow][3] & _
$g_sSep & $g_aArray[$iRow][4] & $g_sSep & $g_aArray[$iRow][5] & $g_sSep & $g_aArray[$iRow][6], $idListview)
GUICtrlSetBkColor(-1, $g_sBkColor)
EndIf
Next
3. Avec _GUICtrlListView_AddItem(), le traitement avec un filtre X s'exécute en 500 ms :
If Execute($sFilters) Then
$iIndex = _GUICtrlListView_AddItem($idListview, $g_aArray[$iRow][0])
For $iCol = 0 To UBound($g_aCol_Name) - 1 ; 500 ms
_GUICtrlListView_AddSubItem($idListview, $iIndex, $g_aArray[$iRow][$iCol], $iCol)
Next
EndIf
GUICtrlSetBkColor(_GUICtrlListView_GetItemParam($idListview, $iIndex), $g_sBkColor) ; Ne fonctionne pas
Next
Mes conclusions :
Si j'utilise _GUICtrlListView_AddItem(), le traitement est rapide mais je ne peux pas différencier une ligne sur deux avec GUICtrlSetBkColor()
Si j'utilise GUICtrlCreateListViewItem(), les lignes sont différenciées mais le temps de traitement est plus important.
Je suis donc obligé de mettre en dur le nombre de colonnes pour obtenir le meilleur temps de traitement au détriment d'un code "statique".
En effet si j'ajoute une colonne à mon tableau dynamiquement (j'ajoute une valeur à mon tableau $g_aCol_Name), je suis obligé d'aller ajouter manuellement :
Autant dire qu'aucune solution ne me convient à 100%.
Auriez-vous une autre piste/astuce à me proposer ?