Autor Tema: Marca en ListView  (Leído 6203 veces)

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

davchi

  • Bit
  • Mensajes: 9
  • Reputación: +1/-0
    • Ver Perfil
Marca en ListView
« en: Enero 23, 2012, 01:03:49 pm »
Tengo un listview en formato lvwReport con clientes
Cuando hago doble click abre otro form, y pasandole el id_paciente puedo editarlo, y cuando lo guardo por medio de una funcion publica que tengo en un modulo, actualizo dicho listview, y luego cierro el form donde edite

Ejemplo
LISTVIEW

id_cliente  nombre  edad
1               luciano   32
2               david      11
3               maria      15

Si hago doble click en la linea del id_cliente 2, abre un form y puedo editarlo, y cuando lo actualizo mediante un boton hago una llamada a una funcion publica que primero me actualiza el listview con los datos actualizados y luego se cierra el form de edicion

Pero el problema que tengo es que quiero que quede marcada la linea que acabo de actualizar.

Alguien ha echo algo parecido, o puede tirarme alguna idea

Muchas Gracias

Esta es la Funcion que uso para llenar el ListView

Código: [Seleccionar]
Public Sub CargarListView_Cliente(LV_Cliente As ListView, rs As ADODB.Recordset)
On Error GoTo ErrorSub
    LV_Cliente.ListItems.Clear
    If rs.RecordCount > 0 Then
        While Not rs.EOF
            Set objItem = LV_Cliente.ListItems.Add(, , rs(0))
           objItem.SubItems(1) = rs!nombre
           objItem.SubItems(2) = rs!edad
            rs.MoveNext
        Wend
    End If
    Exit Sub
ErrorSub:
    If Err.Number = 94 Then Resume Next
End Sub

Y en el form donde lo muestro lo llamo de la siguiente manera

Código: [Seleccionar]
Private Sub Form_Load()
    CargarListView_Cliente LV_Cliente, rs
End Sub

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Marca en ListView
« Respuesta #1 en: Enero 23, 2012, 01:26:20 pm »
Hola vos queres entonces que a pesar de perder el foco siga seleccionado esa linea del LV?
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

ssccaann43

  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Marca en ListView
« Respuesta #2 en: Enero 23, 2012, 01:28:57 pm »
El ListView tiene una propiedad llamada HideSelection. La colocas en False y ya...!
Miguel Núñez.

davchi

  • Bit
  • Mensajes: 9
  • Reputación: +1/-0
    • Ver Perfil
Re:Marca en ListView
« Respuesta #3 en: Enero 23, 2012, 03:32:57 pm »
Poniendo como HideSelection en false, queda en foco siempre la primer linea del listview y no la que edite

davchi

  • Bit
  • Mensajes: 9
  • Reputación: +1/-0
    • Ver Perfil
Re:Marca en ListView
« Respuesta #4 en: Enero 23, 2012, 03:35:40 pm »
Bazooka, el foco lo pierdo ya que al actualizar la BBDD, llamo a la funcion que carga el listview y luego cierro el form donde edito, asi cuando se cierra puedo ver los cambios en el listview


seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Marca en ListView
« Respuesta #5 en: Enero 23, 2012, 07:12:20 pm »
antes de editar guarda el indice de la fila que editaste, y despues de actualizar seleccionala de nuevo a traves del indice que guardaste.

davchi

  • Bit
  • Mensajes: 9
  • Reputación: +1/-0
    • Ver Perfil
Re:Marca en ListView
« Respuesta #6 en: Enero 23, 2012, 10:54:21 pm »
Al indice ya lo tengo guardado, ya que con ese hago los cambios en el FORM de editar, el tema es que no se como pasarle al listview dicho index

Y como tendria que pasarlo a esta funcion

Código: (vb) [Seleccionar]
Public Sub CargarListView_Cliente(LV_Cliente As ListView, rs As ADODB.Recordset)
On Error GoTo ErrorSub
    LV_Cliente.ListItems.Clear
    If rs.RecordCount > 0 Then
        While Not rs.EOF
            Set objItem = LV_Cliente.ListItems.Add(, , rs(0))
           objItem.SubItems(1) = rs!nombre
           objItem.SubItems(2) = rs!edad
            rs.MoveNext
        Wend
    End If
    Exit Sub
ErrorSub:
    If Err.Number = 94 Then Resume Next
End Sub

Que es la que se encarga de cargar el listview
« última modificación: Enero 24, 2012, 12:49:42 am por xkiz ™ »

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Marca en ListView
« Respuesta #7 en: Enero 24, 2012, 09:54:13 am »
despues de cargar el listview pones algo asi:

Código: (vb) [Seleccionar]
LV_Cliente.ListItems(Indice).Selected = True
tambien debes tener la propiedad FullRowSelect = True, y la vista en modo detalle.

otra es que si tenes muchos items y el item que seleccionas esta debajo del scroll, debes ponerle tambien .EnsureVisible = True, porque sino no se va a "scrollar" y te va a quedar seleccionado pero no se va a mostrar. busca en internet de esto hay ejemplos.

saludos.

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Marca en ListView
« Respuesta #8 en: Enero 24, 2012, 04:22:26 pm »
Yo lo que hago es después de editar actualizo solo las columnas que ve el usuario.

Código: (VB) [Seleccionar]
ComandoSQL = "UPDATE clientes SET cedula=" & V02 & "," & "nombre=" & V03 & "," & "ciudad=" & V04 & ""
ComandoSQL = ComandoSQL & " WHERE codigo=" & txtCodigo.Text
cnADO.Execute ComandoSQL

LCLientes.SelectedItem.Text  = txtCedula.Text
LCLientes.SelectedItem.SubItems(1) = txtNombre.Text
LCLientes.SelectedItem.SubItems(2) = txtCiudad.Text
LClientes.SetFocus

Lo hago así para evitar recargar toda la tabla en el ListView.
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

davchi

  • Bit
  • Mensajes: 9
  • Reputación: +1/-0
    • Ver Perfil
Re:Marca en ListView
« Respuesta #9 en: Febrero 11, 2012, 12:55:10 am »
Muchas Gracias ENTER, seba123neo, ssccaann43 y Bazooka por su tiempo y las ideas.
Al final he mirado como ha dicho ENTER, ya que me parecio genial el poder cargar solo la linea que estoy editando y no recargar todo el ListView

y el Codigo ha quedado asi

Modulo
Código: (vb) [Seleccionar]
Public Sub CargarListView_Cliente(LV_Cliente As ListView, rs As ADODB.Recordset)
On Error GoTo ErrorSub
    LV_Cliente.ListItems.Clear
    If rs.RecordCount > 0 Then
        While Not rs.EOF
            Set objItem = LV_Cliente.ListItems.Add(, , rs(0))
           objItem.SubItems(1) = rs!name
           objItem.SubItems(2) = rs!age
           objItem.SubItems(3) = rs!address
           
            rs.MoveNext
        Wend
    End If
    Exit Sub
ErrorSub:
    If Err.Number = 94 Then Resume Next
End Sub

Form1:
Código: (vb) [Seleccionar]
Private Sub Form_Load()
    CargarListView_Cliente LV_Cliente, rs
End Sub

Private Sub LV_Cliente_DblClick()
    Dim i As Integer
   
    With form2
   
        .IdCliente = LV_Cliente.SelectedItem.Text
       
        For i = 1 To 3
            .Text1(i).Text = LV_Cliente.SelectedItem.ListSubItems(i).Text
        Next
       
        .Show vbModal
       
    End With

End Sub

Form2:
Código: (vb) [Seleccionar]
Private Sub cmdSave_Click()
Dim i As Integer
On Error GoTo ErrorSub

    Select Case ACCION
        Case EDITAR_REGISTRO_CLIENTE
   
            cnn.Execute "UPDATE clientes set name = '" & Trim(Text1(1)) & _
                                             "', age = '" & Trim(Text1(2)) & _
                                             "', address = '" & Trim(Text1(3)) & _
                                             "' where id_cliente = " & IdCliente & ""
        With Form1
            .LV_Cliente.SelectedItem.EnsureVisible
                For i = 1 To 3
                    .LV_Cliente.SelectedItem.SubItems(i) = Text1(i)
                Next i
        End With
        'Aca envio al ListView los datos Modificados y solo recargo los datos de dicho cliente y no recargo todo el ListView
       
        Case AGREGAR_REGISTRO_CLIENTE
       
            cnn.Execute "INSERT INTO clientes " & "(name,age,address) VALUES('" & _
                                     Trim(Text1(1)) & "','" & Val(Text1(2)) & "','" & Trim(Text1(3)) & "')"
       
    rs.Requery 1
   
    Call CargarListView_Cliente(Form1.LV_Cliente, rs)
    'Aca llamo a la Funcion del Modulo ya que tengo que volver a llenar el ListView para que aparezca el nuevo Cliente
    End Select
   
    DoEvents
   
    Unload Me
   
    Set Form2 = Nothing
   
Exit Sub
ErrorSub:
MsgBox Err.Description

End Sub

Y tambien no quiero olvidarme de acalanto de http://www.foro.vb-mundo.com quien me ha dado un ejemplo y mas sus ideas he conseguido que funcione, no se si sera la mejor o mas efectiva de las formas, pero funciono, mas adelante vere si puedo mejorar mas ahun dicho codigo

MUCHAS GRACIAS
« última modificación: Febrero 11, 2012, 12:57:07 am por davchi »

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Marca en ListView
« Respuesta #10 en: Febrero 11, 2012, 03:33:22 am »
esta bien, solo decir que esa forma de actualizar la fila que modificas, te puede servir si solo es texto, pero si tenes relaciones entre los registros o calculos que realizar y que involucran a varios registros, ahi ya eso no funcionaria.

saludos.