Le problème n'est pas vraiment de savoir à quel moment je doit faire mon tri mais plutôt par quelle commande je dois remplacer [rafraichissement de la listview] ...
Enfin merci a tous d'avoir réfléchi à mon problème mais j'ai finalement trouvé une solution hier. J'ai modifié l'UDF GUIListView et la fonction _GUICtrlListView_RegisterSortCallBack() pour qu'elle accepte en paramètre une fonction de tri custom.
Code : Tout sélectionner
Func _GUICtrlListView_RegisterSortCallBack2($hWnd, $sFuncSortCallBck, $fNumbers = True, $fArrows = True)
If $Debug_LV Then __UDF_ValidateClassName($hWnd, $__LISTVIEWCONSTANT_ClassName)
If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
Local $hHeader = _GUICtrlListView_GetHeader($hWnd)
ReDim $aListViewSortInfo[UBound($aListViewSortInfo) + 1][$iLListViewSortInfoSize]
$aListViewSortInfo[0][0] = UBound($aListViewSortInfo) - 1
Local $iIndex = $aListViewSortInfo[0][0]
$aListViewSortInfo[$iIndex][1] = $hWnd ; Handle/ID of listview
$aListViewSortInfo[$iIndex][2] = _
DllCallbackRegister($sFuncSortCallBck, "int", "int;int;hwnd") ; Handle of callback
$aListViewSortInfo[$iIndex][3] = -1 ; $nColumn
$aListViewSortInfo[$iIndex][4] = -1 ; nCurCol
$aListViewSortInfo[$iIndex][5] = 1 ; $nSortDir
$aListViewSortInfo[$iIndex][6] = -1 ; $nCol
$aListViewSortInfo[$iIndex][7] = 0 ; $bSet
$aListViewSortInfo[$iIndex][8] = $fNumbers ; Treat as numbers?
$aListViewSortInfo[$iIndex][9] = $fArrows ; Use arrows in the header of the columns?
$aListViewSortInfo[$iIndex][10] = $hHeader ; Handle to the Header
Return $aListViewSortInfo[$iIndex][2] <> 0
EndFunc ;==>_GUICtrlListView_RegisterSortCallBack2
Ensuite j'ai modifier la fonction de tri que j'utilisais avec GUICtrlRegisterListViewSort() pour quelle soit appeler comme la fonction __GUICtrlListView_Sort($nItem1, $nItem2, $hWnd) de l'UDF ( à savoir 2 entier correspondant au index des item a comparer et le handle de la listview à trier). De cette manière a la création de mes listview je leur associe ma fonction de tri :
Code : Tout sélectionner
$listview = GUICtrlCreateListView("Col1|Col2|Col3", 0, 20, 698, 760)
_GUICtrlListView_RegisterSortCallBack2($listview, "__LVSort", True, False)
et on lance le tri comme ça :
Pour la fonction __LVSort de tri, il suffit de s'inspirer de l'exemple de l'aide donné pour la fonction GuiCtrlRegisterListviewSort et retrouver les numéros de dans la fonction :
Code : Tout sélectionner
Func __LVSort($nItem1, $nItem2, $hWnd)
Local $iIndex, $tInfo, $val1, $val2, $nResult
$tInfo = DllStructCreate($tagLVFINDINFO)
DllStructSetData($tInfo, "Flags", $LVFI_PARAM)
For $x = 1 To $aListViewSortInfo[0][0]
If $hWnd = $aListViewSortInfo[$x][1] Then
$iIndex = $x
ExitLoop
EndIf
Next
$aListViewSortInfo[$iIndex][6] = $aListViewSortInfo[$iIndex][3] ; $nCol = $nColumn
$nColumn = $aListViewSortInfo[$iIndex][3]
; on récupère les valeurs à comparer
DllStructSetData($tInfo, "Param", $nItem1)
$valItem1 = _GUICtrlListView_FindItem($hWnd, -1, $tInfo)
DllStructSetData($tInfo, "Param", $nItem2)
$valItem2 = _GUICtrlListView_FindItem($hWnd, -1, $tInfo)
$val1 = _GUICtrlListView_GetItemText($hWnd, $valItem1, $aListViewSortInfo[$iIndex][3])
$val2 = _GUICtrlListView_GetItemText($hWnd, $valItem2, $aListViewSortInfo[$iIndex][3])
; on met en forme ces valeurs (ici comparaison d'interface d'équipements réseaux)
If $nColumn = 0 Then
If $val1 = $val2 Then
$val1 = _GUICtrlListView_GetItemText($hWnd, $valItem1, 1)
$val2 = _GUICtrlListView_GetItemText($hWnd, $valItem2, 1)
$offset1 = 0
$offset2 = 0
If StringLeft($val1, 2) = "RE" Then $offset1 = -10
If StringLeft($val2, 2) = "RE" Then $offset2 = -10
If StringRegExp($val1, "g\d+", 0) Then $offset1 = 100
If StringRegExp($val2, "g\d+", 0) Then $offset2 = 100
$val1 = Int(StringRegExpReplace($val1, "[^\d]", "")) + $offset1
$val2 = Int(StringRegExpReplace($val2, "[^\d]", "")) + $offset2
Else
If StringRegExp($val1, "H\d+", 0) And StringRegExp($val2, "H\d+", 0) Then
$val1 = Int(StringTrimLeft($val1, 1))
$val2 = Int(StringTrimLeft($val2, 1))
EndIf
EndIf
EndIf
; on compare les valeurs pour retourner -1 1 ou 0
$nResult = 0 ; No change of item1 and item2 positions
If $val1 < $val2 Then
$nResult = -1 ; Put item2 before item1
ElseIf $val1 > $val2 Then
$nResult = 1 ; Put item2 behind item1
EndIf
$nResult = $nResult * $aListViewSortInfo[$iIndex][5] ; $nSortDir
Return $nResult
EndFunc ;==>__GUICtrlListView_Sort
C'est pas simple mais ça fonctionne bien. Je suis tout de même très étonné qu'il n'existe pas un moyen de faire la même chose en partant de la fonction GuiCtrlRegisterListviewSort.
Merci encore pour votre aide.