buscar en listview con api

aprendiz_333
08 de Diciembre del 2007
Buenas... consegui este codigo de la web el cual busca datos solo en la Primera Columna de un listview, pero necesito que busque los datos UNICAMENTE de la tercera columna, ¿que podria modificar para obtener este resultado? .. muchas gracias por alguna sugerencia.

Option Explicit
'UDT necesarias para usar con SendMessage
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type LVFINDINFO
flags As Long
psz As String
lParam As Long
pt As POINTAPI
vkDirection As Long
End Type
'Función Api SendMessage
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

'Constantes para SendMessage
Private Const LVM_FIRST = &H1000
Private Const LVM_FINDITEM = (LVM_FIRST + 13)
Private Const LVFI_PARAM = &H1
Private Const LVFI_STRING = &H2
Private Const LVFI_PARTIAL = &H8
Private Const LVFI_WRAP = &H20
Private Const LVFI_NEARESTXY = &H40

'Variable de retorno y para la estructura
Dim lRet As Long, LFI As LVFINDINFO

'Procedimiento que busca: Se le envía el control ListView y el texto a buscar
Private Sub Buscar_ListView(ListView As ListView, Cadena As String)
'Cadena parcial
LFI.flags = LVFI_PARTIAL Or LVFI_WRAP
If Cadena = "" Then
Exit Sub
End If

'Se le asigna a esta variable la cadena que luego se le envía a SendMessage
LFI.psz = Cadena

'Le enviamos el mensaje LVM_FINDITEM, la estructura y rel ListView
lRet = SendMessage(ListView1.hwnd, LVM_FINDITEM, -1, LFI)

If lRet >= 0 Then
'Seleccionamos el item del Listview
ListView1.SelectedItem = ListView1.ListItems(lRet + 1)
'Propiedad opcional
ListView1.HideSelection = False
'Si el item se encuentra fuera del área visible desplazamos la lista _
para poder visualizarlo con el método EnsureVisible
ListView1.SelectedItem.EnsureVisible
End If
End Sub

Function Buscar(Lv As ListView, _
Cadena As String, _
nCol As Integer) As Long
Dim i As Long
Dim oItem As ListItem
With Lv
For i = 1 To Lv.ListItems.Count
Set oItem = Lv.ListItems(i)
If InStr(StrConv(oItem.SubItems(nCol), vbLowerCase), StrConv(Cadena, vbLowerCase)) Then
Buscar = oItem.Index
Exit For
End If
Next
End With
End Function

Private Sub txtbuscar_Change()
Call Buscar_ListView(ListView1, txtbuscar)
End Sub

mvallejos
08 de Diciembre del 2007
Hay una forma mucho más fácil con un bucle for
En un ListView, la primer columna es la propiedad Text de un item, las columnas siguientes son subitems, por lo que la columna nro 3 del listview, es el subitem de indice 2

Dim i as Integer
Dim IT as ListItem

For i = 1 To ListView1.ListItems.Count
Set IT = ListView1.ListItems( i )
If IT.SubItems( 2 ) = Dato Buscado Then
<< acciones >>
End If
Next i

Saludos

aprendiz_333
08 de Diciembre del 2007
GRACIAS.. .voy a probar el codigo