[APORTE] Poner orden en columnas de ucListView

Iniciado por raul338, 30 Noviembre 2010, 01:23 AM

0 Miembros y 1 Visitante están viendo este tema.

raul338

Buenas. Esto es un agregado al ucListView de Carles PV en el que pongo mediante flags que las columnas muestren el triangulito al lado (winXP) o arriba y que ademas se ponga la cabecera de la columna azulada (win7)

Porque a veces las columnas se vuelven locas y hay que poner orden xD

Si alguno probo Win7, vera que en el ListView el orden se muestra de una forma distinta


Poniendo el triangulo arriba y remarcando el Header de la columna ordenada.

Pues se me ocurrio buscar como lograr eso, y encontre Esto que es parte de como se maneja un ListView por API. Me di cuenta que ya no se agrega un triángulo al listview, es anticuado, ahora es mediante unos flags en el formato de la cabecera. Entonces me decidí modificar el ucListView para que acepte eso en sus columnas. Y aqui el resultado

En el control de usuario, agregar lo siguiente

En las declaraciones
Código (vb) [Seleccionar]
Private Const HDF_SORTDOWN As Long = &H400
Private Const HDF_SORTUP As Long = &H200


En las Propiedades
Código (vb) [Seleccionar]

Public Property Get ColumnOrder(ByVal Column As Integer) As eSortOrderConstants
   Dim uHDI   As HDITEM
   If (m_hListView And m_hHeader) Then
       uHDI.mask = LVCF_FMT
       Call SendMessage(m_hListView, HDM_GETITEM, Column, uHDI)
       If (HDF_SORTDOWN And uHDI.fmt) Then
           ColumnOrder = soDescending
       ElseIf (HDF_SORTUP And uHDI.fmt) Then
           ColumnOrder = soAscending
       Else
           ColumnOrder = soDefault
       End If
   End If
End Property
Public Property Let ColumnOrder(ByVal Column As Integer, ByVal order As eSortOrderConstants)
   Dim uHDI   As HDITEM
   If (m_hListView And m_hHeader) Then
       With uHDI
           .mask = HDI_FORMAT
           Call SendMessage(m_hHeader, HDM_GETITEM, Column, uHDI)
           If order = soAscending Then
               .fmt = (.fmt And Not HDF_SORTDOWN) Or HDF_SORTUP
           ElseIf order = soDescending Then
               .fmt = (.fmt And Not HDF_SORTUP) Or HDF_SORTDOWN
           Else
               .fmt = .fmt And Not (HDF_SORTUP Or HDF_SORTDOWN)
           End If
       End With
       Call SendMessage(m_hHeader, HDM_SETITEM, Column, uHDI)
   End If
End Property


Y listo, para que ver la modificacion en accion ponen en un ucListView

Código (vb) [Seleccionar]
Private Sub ucListView1_ColumnClick(Column As Integer)
   If ucListView1.ColumnOrder(Column) = soAscending Then
       ucListView1.ColumnOrder(Column) = soDescending
   Else
       ucListView1.ColumnOrder(Column) = soAscending
   End If


Y les quedara asi:


Aunque no es muy lindo que quede asi digamos.... para que paresca un ListView Comun y corriente, con este codigo alcanza

Código (vb) [Seleccionar]
Private Sub ucListView1_ColumnClick(Column As Integer)
  Dim nCol As Integer

   With ucListView1
       If (.Count > 1) Then
           For nCol = 0 To 2
               If (nCol <> Column) Then .ColumnOrder(nCol) = soDefault
           Next nCol
           If .ColumnOrder(Column) = soAscending Then
               .ColumnOrder(Column) = soDescending
             Else
               .ColumnOrder(Column) = soAscending
           End If
           ' Aca su rutina para ordenar
       End If
   End With
End Sub


PD: Deben compilar el proyecto para verlo visualmente, desde el IDE (salvo que le hayan puesto un manifest, aunque dudo que funcione) no se mostrará

Espero que les sirva!
Pueden bajar el control modificado, con el ejecutable y un ejemplo descargandolo Aca


Originalmente para El foro de LeandroA