Code : Tout sélectionner
Func My_GUICtrlListView_SetSQL($hWnd, ByRef $oCONN, $SQL_Table, $i1stField = 0, $iParamField = -1, $Filter = "", $Sort = "", _
$iAutoSize = 80, $bShowParam = True, $bTable = False, $aColumn = 0, $iCheckedField = -1)
If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
Local $hHeader = _GUICtrlListView_GetHeader($hWnd), $Align = $HDF_LEFT, $iItem, $iSubItem
Local $adCmd = $adCmdText, $ColumnName
If $bTable Then $adCmd = $adCmdTable
Local $oRS
If IsObj($SQL_Table) Then
$oRS = $SQL_Table
Else
$oRS = _ADORecordSet_Open($SQL_Table, $oCONN, $adOpenDynamic, $adLockOptimistic, $adCmd)
EndIf
$oRS.Filter = $Filter
$oRS.Sort = $Sort
;~ ConsoleWrite("SQl ou Table: " & $SQL_Table & @LF)
;~ ConsoleWrite("Filtre: " & $oRS.Filter & @LF)
;~ ConsoleWrite("Tri: " & $oRS.Sort & @LF & @LF)
_GUICtrlListView_BeginUpdate($hWnd)
_GUICtrlListView_DeleteAllItems($hWnd)
While _GUICtrlListView_GetColumnCount($hWnd) > 0
_GUICtrlListView_DeleteColumn($hWnd, 0)
WEnd
For $iIndex = 0 To $oRS.Fields.Count - 1
If Not $bShowParam And $iIndex = $iParamField Then ContinueLoop
If IsArray($aColumn) And UBound($aColumn) > $iIndex And $aColumn[$iIndex] <> "" Then
$ColumnName = $aColumn[$iIndex]
Else
$ColumnName = $oRS.Fields($iIndex).Name
EndIf
If $ColumnName = -1 Then ContinueLoop
Switch $oRS.Fields($iIndex).Type
Case $adInteger, $adSmallInt, $adTinyInt, $adBigInt, _
$adUnsignedInt, $adUnsignedSmallInt, $adUnsignedTinyInt, $adUnsignedBigInt, _
$adSingle, $adDecimal, $adDouble, $adNumeric, $adVarNumeric
$Align = $HDF_RIGHT
Case $adCurrency
$Align = $HDF_RIGHT
Case $adBoolean
$Align = $HDF_CENTER
Case $adDate, $adDBDate, $adDBTime, $adDBTimeStamp, $adFileTime
$Align = $HDF_CENTER
Case Else
$Align = $HDF_LEFT
EndSwitch
Local $Match = StringRegExp($oRS.Sort, "(?i)\.*[`""'\[]*(" & $oRS.Fields($iIndex).Name & ")[`""'\]]*\s*[asc]*(desc)*", 3)
If IsArray($Match) Then
If UBound($Match) = 2 Then
$Align = BitOR($Align, $HDF_SORTDOWN)
Else
$Align = BitOR($Align, $HDF_SORTUP)
EndIf
EndIf
$iItem = _GUICtrlListView_AddColumn($hWnd, $ColumnName)
_GUICtrlHeader_SetItemFormat($hHeader, $iItem, BitOR($HDF_STRING, $Align))
Next
While Not $oRS.EOF
$iItem = _GUICtrlListView_AddItem($hWnd, _ADOField_GetValue($oRS.Fields($i1stField), False))
If $iParamField > -1 Then _GUICtrlListView_SetItemParam($hWnd, $iItem, Int($oRS.Fields($iParamField).Value))
$iSubItem = 1
For $iIndex = 0 To $oRS.Fields.Count - 1
If $iIndex = $i1stField Then ContinueLoop
If Not $bShowParam And $iIndex = $iParamField Then ContinueLoop
If IsArray($aColumn) And UBound($aColumn) > $iIndex And $aColumn[$iIndex] <> "" Then
$ColumnName = $aColumn[$iIndex]
Else
$ColumnName = $oRS.Fields($iIndex).Name
EndIf
If $ColumnName = -1 Then ContinueLoop
_GUICtrlListView_AddSubItem($hWnd, $iItem, _ADOField_GetValue($oRS.Fields($iIndex), False), $iSubItem)
If $iIndex = $iCheckedField And $oRS.Fields($iIndex).Value Then _GUICtrlListView_SetItemChecked($hWnd, $iItem)
$iSubItem += 1
Next
$oRS.MoveNext
WEnd
$oRS.Close
My_GUICtrlListView_AutoSizeColumns($hWnd, $iAutoSize)
_GUICtrlListView_EndUpdate($hWnd)
EndFunc ;==>My_GUICtrlListView_SetSQL
Func _ADORecordSet_Open($SQL, ByRef $oConn, $adOpen = $adOpenDynamic, $adLock = $adLockOptimistic, $adCmd = $adCmdText, $MaxRecords = 0)
If Not IsObj($oConn) Then Return SetError(1, 0, 0)
Local $oRs = ObjCreate("ADODB.Recordset")
;~ $oRs.MaxRecords = $MaxRecords
If $MaxRecords Then $oRs.PageSize = $MaxRecords
Switch $oConn.Properties("DBMS Name" ).Value
Case "PostgreSQL"
If $adCmd = $adCmdTable Then $SQL = "SELECT * FROM " & $SQL
$SQL = StringRegExpReplace($SQL, "(\[|\])", """")
$adCmd = $adCmdText
Case "MySQL"
If $adCmd = $adCmdTable Then $SQL = "SELECT * FROM " & $SQL
$SQL = StringRegExpReplace($SQL, "(\[|\])", "`")
$adCmd = $adCmdText
EndSwitch
$oRs.Open($SQL, $oConn, $adOpen, $adLock, $adCmd)
Return $oRs
EndFunc ;==>_ADORecordSet_Open
Func My_GUICtrlListView_AutoSizeColumns($hWnd, $iMini = 80)
If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
Local $hHeader = _GUICtrlListView_GetHeader($hWnd), $iHeader_Width, $iData_Width
_GUICtrlListView_BeginUpdate($hWnd)
For $iIndex = 0 To _GUICtrlListView_GetColumnCount($hWnd) - 1
If _GUICtrlListView_GetColumnWidth($hWnd, $iIndex) = 0 Then ContinueLoop
_GUICtrlListView_SetColumnWidth($hWnd, $iIndex, $LVSCW_AUTOSIZE_USEHEADER)
$iHeader_Width = _GUICtrlListView_GetColumnWidth($hWnd, $iIndex)
If @OSVersion = "WIN_XP" And $iIndex < _GUICtrlListView_GetColumnCount($hWnd) - 1 Then
If _GUICtrlHeader_GetItemFlags($hHeader, $iIndex) / 2 > 1 Then $iHeader_Width += 30
EndIf
_GUICtrlListView_SetColumnWidth($hWnd, $iIndex, $LVSCW_AUTOSIZE)
$iData_Width = _GUICtrlListView_GetColumnWidth($hWnd, $iIndex)
If $iHeader_Width > $iData_Width Then
_GUICtrlListView_SetColumnWidth($hWnd, $iIndex, $iHeader_Width)
EndIf
If _GUICtrlListView_GetColumnWidth($hWnd, $iIndex) < $iMini Then
_GUICtrlListView_SetColumnWidth($hWnd, $iIndex, $iMini)
EndIf
Next
_GUICtrlListView_EndUpdate($hWnd)
EndFunc ;==>My_GUICtrlListView_AutoSizeColumns