Listview + OnKeyPress event

Iniciado por Eleкtro, 6 Enero 2013, 02:18 AM

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

Eleкtro

Lo siento pero no se como se le llama a lo que pretendo hacer, así que le llamaré "easy-find" xD,

Esta listview tiene 4 columnas, y me gustaría que la listview se comportase de la siguiente manera con la columna nº 2 ("Archivo"):

- Al pulsar una tecla del teclado (una tecla del alfabeto), visualizar/seleccionar la primera línea que empiece por esa letra.

- (MENOS IMPORTANTE) > Si la columna está desordenada, la misma lógica pero seleccionar la línea más cercana empezando a buscar desde la linea seleccionada, HACIA ABAJO.

Imagino que costará un poco de trabajo así que no lo pido todo hecho, pero ayúdenme a empezar, lo del evento "OnKeyPress" es fácil de hacer, pero no sé como podría hacer el "easy-find"...


Para el primer problema he pensado en recorrer con un FOR todo el array de "ListView.Items()" para buscar el subitem que empiece por la letra presionada, pero de todas formas he preferido hacer este post por si saben de alguna manera más sencilla y/o rápida.









seba123neo

el mismo listview ya tiene metodos de busqueda, si lo buscas en internet en 3 segundos lo encontras  :silbar:, por ejemplo algo simple con FindItemWithText

Código (vbnet) [Seleccionar]
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim lvItem As ListViewItem = ListView1.FindItemWithText("G", False, 0, True)

        If (lvItem IsNot Nothing) Then
            ListView1.Items(lvItem.Index).Selected = True
            ListView1.Select()
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ListView1.Columns.Add("Columna 1")
        ListView1.View = View.Details
        ListView1.FullRowSelect = True

        For i As Int16 = Convert.ToInt16("A"c) To Convert.ToInt16("Z"c)
            Dim letter As Char = Convert.ToChar(i)
            ListView1.Items.Add(letter)
        Next
    End Sub
End Class


carga todas las letras del abecedario en una columna y despues con el boton busca la letra "G" y la selecciona.

despues tenes otras como FindNearestItem, para seguir buscando a partin de una posicion determinada, hay varias formas.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Eleкtro

#2
uf, muchas gracias Seba,
me quitas un peso de encima con ese method, estaba cagado de miedo por si la única alternativa era usar el ObjectListView (Alguna de sus propiedades que hiciera eso automáticamente), no sé si será muy lógico lo que acabo de decir... porque siempre se puede codear lo necesario o en este caso ya hay un method que nos ayuda a hacerlo, pero ... :xD

PD: Deseando ver un día de estos un tutorial de como crear el modelo de objeto para agregar un item en el ObjectListView  :silbar:  ;D

Saludos








seba123neo

Cita de: EleKtro H@cker en  6 Enero 2013, 03:33 AM
PD: Deseando ver un día de estos un tutorial de como crear el modelo de objeto para agregar un item en el ObjectListView  :silbar:  ;D

si, lo estoy haciendo  :xD, no solo eso, sino como hacer varias cosas mas, entre ellas la busqueda del objectlistview que es super potente.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Eleкtro

Cita de: seba123neo en  6 Enero 2013, 03:44 AMsi, lo estoy haciendo  :xD

A ver si no recuerdo mal spiritdead dijo que el objeto se debe crear en una class, de ser así imagino que esa manera será para agregar objetos/items predefinidos al listview,
¿Pero que pasa entonces si yo necesito añadir los items sin conocer cuales son los items? es decir, por ejemplo parsear un texto delimitado e ir agregando los items uno por uno:

Línea de un texto cualquiera:
Simple Plan - I Can Wait Forever;4m:54s;128 Kbps;4,49 MB

Ejemplo de como se añadiría en un listview convencional:
Código (vbnet) [Seleccionar]
' llamo al sub que hace un SPLIT en cada línea del texto...

' Seteo los strings...
Listview_Row_STR(1) = TextDelimited(0)
Listview_Row_STR(2) = TextDelimited(1)
Listview_Row_STR(3) = TextDelimited(2)

' Y añado el item
Listview_Item = New ListViewItem(Listview_Row_STR)
GListView.Items.Add(Listview_Item)


¿En el tutorial explicarás como hacer algo así? me refiero a añadir los items "en tiempo real", sin haberlos predefinido en una class.

Bueno, ya me esperaré a que salga el tuto para hacer allí las preguntas xD.

Saludos.








spiritdead

Cita de: EleKtro H@cker en  6 Enero 2013, 03:56 AM
A ver si no recuerdo mal spiritdead dijo que el objeto se debe crear en una class, de ser así imagino que esa manera será para agregar objetos/items predefinidos al listview,
¿Pero que pasa entonces si yo necesito añadir los items sin conocer cuales son los items? es decir, por ejemplo parsear un texto delimitado e ir agregando los items uno por uno:

Línea de un texto cualquiera:
Simple Plan - I Can Wait Forever;4m:54s;128 Kbps;4,49 MB

Ejemplo de como se añadiría en un listview convencional:
Código (vbnet) [Seleccionar]
' llamo al sub que hace un SPLIT en cada línea del texto...

' Seteo los strings...
Listview_Row_STR(1) = TextDelimited(0)
Listview_Row_STR(2) = TextDelimited(1)
Listview_Row_STR(3) = TextDelimited(2)

' Y añado el item
Listview_Item = New ListViewItem(Listview_Row_STR)
GListView.Items.Add(Listview_Item)


¿En el tutorial explicarás como hacer algo así? me refiero a añadir los items "en tiempo real", sin haberlos predefinido en una class.

Bueno, ya me esperaré a que salga el tuto para hacer allí las preguntas xD.

Saludos.

si usaras objectlistview, debes tener en cuanta varios aspectos

puedes usar structures o clases
Facilitador De Tareas - Task Simplifier (FDT)