ListView控件點擊列名排序源碼

  勇芳 2018-2-24 6142

QQ截圖20180224222703.jpg

ListView控件,列表名點擊一下,自動排序此列,同時顯示小3角,再點一次自動切換正序與倒序,

啥都不說,直接上代碼,復制去,調用即可。

使用例題

'用法:在列單擊事件中加入下面內容即可
Function FORM10_LISTVIEW2_LVN_COLUMNCLICK ( _
                                          ControlIndex  As Long,            _  ' 在控件數組索引
                                          hWndForm      As DWord,           _  ' 窗體的句柄
                                          hWndControl   As DWord,           _  ' 控件的句柄
                                          ByVal lpNMV   As NM_LISTVIEW Ptr  _  ' 指針指向 NM_LISTVIEW
                                          ) As Long
    ' 排序 ListView
    JPL_ListView_ColumnToSort(hWndControl, lpNMV)
End Function

排序源碼:

' 要能夠使用 ListView_ColumnToSort() 函數的結構
Type JPL_ListView_ComparePar
    hWndControl As HWnd 
    Column      As UInteger 
    SortOrder   As UInteger
End Type
' 常數
Const SO_NONE       = 0
Const SO_ASCENDING  = 1
Const SO_DESCENDING = 2
'--------------------------------------------------------------------------------
Sub JPL_ListView_DrawHeaderArrow(hWndControl As HWnd , ByVal pColumn As Long, ByVal pSortOrder As Long)
    Dim hHeader As HWnd  
    Dim HDI As HD_ITEM
    hHeader =Cast(HWnd, SendMessage(hWndControl, LVM_GetHeader, 0, 0) )    
    HDI.mask = HDI_FORMAT
    Header_GetItem(hHeader, pColumn, @HDI)
    ' 取決于排序次序 (SO_NONE, SO_ASCENDING, SO_DESCENDING) 
    Select Case pSortOrder
        Case SO_NONE
            ' 刪除向下箭頭或向上箭頭
            HDI.fmt = HDI.fmt And Not (HDF_SORTDOWN Or HDF_SORTUP) 
        Case SO_ASCENDING
            ' 這一項目上繪制一個向上箭頭
            HDI.fmt = HDI.fmt And Not HDF_SORTDOWN
            HDI.fmt = HDI.fmt Or      HDF_SORTUP                       
        Case SO_DESCENDING
            ' 在這個項目上繪制一個向下箭頭
            HDI.fmt = HDI.fmt And Not HDF_SORTUP 
            HDI.fmt = HDI.fmt Or      HDF_SORTDOWN                             
    End Select       
    Header_SetItem(hHeader, pColumn, @HDI)
End Sub
'--------------------------------------------------------------------------------
Function JPL_ListView_CompareFunc ( ByVal index1 As Long, _
                                  ByVal index2 As Long, _
                                  ByVal lpListView_ComparePar As JPL_ListView_ComparePar Ptr _
                                  )  As Long
  Dim zItem1    As String
  Dim zItem2    As String
  Dim lNumeric1 As Double
  Dim lNumeric2 As Double
  Dim lReturn   As Integer
  ' 從列表視圖中獲取價值
  zItem1 =FF_ListView_GetItemText(lpListView_ComparePar->hWndControl, index1, lpListView_ComparePar->Column)
  zItem2 =FF_ListView_GetItemText(lpListView_ComparePar->hWndControl, index2, lpListView_ComparePar->Column)
  '--------------------------------------------------------------------------------------------
  ' 確定哪種類型的排序 (日期、 數字或字符) 根據列點擊
  '--------------------------------------------------------------------------------------------
  ' 日期
'  If IsDate(zItem1) And IsDate(zItem2) Then '速度太慢,放棄
'      lNumeric1 = DateValue(zItem1)
'      lNumeric2 = DateValue(zItem2)
'      If lNumeric1 < lNumeric2 Then lReturn = -1 Else If lNumeric1 > lNumeric2 Then lReturn = +1 Else lReturn = 0
'  Else
      ' 數字
      If JPL_IsNumeric(zItem1) And JPL_IsNumeric(zItem2) Then
          zItem1=FF_Remove (zItem1," ")   ' Remove Any numeric 1000's space
          zItem2=FF_Remove (zItem2," ")
          lNumeric1 = Val(zItem1)
          lNumeric2 = Val(zItem2)
          If lNumeric1 < lNumeric2 Then lReturn = -1 Else If lNumeric1 > lNumeric2 Then lReturn = +1 Else lReturn = 0
      Else
          ' 字符
          zItem1 = LTrim(zItem1)
          zItem2 = LTrim( zItem2 )
          lReturn = Lstrcmpi(zItem1, zItem2)
      End If
'  End If 
  If lpListView_ComparePar->SortOrder = SO_ASCENDING Then Function = lReturn Else Function = -lReturn
End Function
'--------------------------------------------------------------------------------
Sub JPL_ListView_ColumnToSort(hWndControl As HWnd , ByVal lpNMV As NM_LISTVIEW Ptr)
    ' 為比較結構                                                               
    Dim lListView_ComparePar      As JPL_ListView_ComparePar 
    ' 局部變量                                                               
    Dim lListViewSortOrder        As Long
    Dim lListViewLastSortedColumn As Long
    ' 加載列表視圖的當前值   
    lListViewSortOrder        = ValInt(FF_Control_GetTag (hWndControl))
    lListViewLastSortedColumn = ValInt(FF_Control_GetTag2(hWndControl))                                                      
    ' 若要反轉排序順序
    If lListViewSortOrder = SO_ASCENDING Then lListViewSortOrder = SO_DESCENDING Else lListViewSortOrder = SO_ASCENDING
    ' 遏止以前排序的列上的箭頭 (包含零被單擊的基于的列號)
    If lListViewLastSortedColumn <> - 1 And _
       lListViewLastSortedColumn <> lpNMV->iSubItem Then  JPL_ListView_DrawHeaderArrow(hWndControl, lListViewLastSortedColumn, SO_NONE )
    ' 排序列表視圖中選擇的列
    lListView_ComparePar.hWndControl = hWndControl
    lListView_ComparePar.Column      = lpNMV->iSubItem
    lListView_ComparePar.SortOrder   = lListViewSortOrder  
     SendMessage( hWndControl , LVM_SORTITEMSEX ,Cast(wParam, @lListView_ComparePar ),Cast(lParam,@JPL_ListView_CompareFunc ) )                                             
    ' 向下箭頭或向上箭頭上繪制這一項目。
    JPL_ListView_DrawHeaderArrow(hWndControl, lpNMV->iSubItem, lListViewSortOrder)
    ' 要保存的已排序的列號
    lListViewLastSortedColumn = lpNMV->iSubItem
    ' 保存對此列表視圖的最新設置
    FF_Control_SetTag(hWndControl , Str(lListViewSortOrder))
    FF_Control_SetTag2(hWndControl, Str(lListViewLastSortedColumn))    

End Sub
'--------------------------------------------------------------------------------
Function JPL_IsNumeric(pValue As String ) As Long '分析是不是數字
    If UCase(Left(pValue,2))="&H" Then
        If FF_Verify (1,Mid(pValue,3), "0123456789ABCDEF") = 0 Then Function = True Else Function = False
    Else
        If FF_Verify (1,pValue, "0123456789.,'+-") = 0 Then Function = True Else Function = False
    End If    
End Function




因國家互聯網安全管理要求,關閉回帖功能。大家需要留言,請使用【勇芳軟件客服】即時聯系勇芳點此打開->>勇芳軟件客服
返回
聯系勇芳
一个人看的www视频播放中文_2012中文字幕电影_亚洲国产成人高清在线观看_中文字幕天堂最新版在线网