Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: davchi 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
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
Private Sub Form_Load()
CargarListView_Cliente LV_Cliente, rs
End Sub
-
Hola vos queres entonces que a pesar de perder el foco siga seleccionado esa linea del LV?
-
El ListView tiene una propiedad llamada HideSelection. La colocas en False y ya...!
-
Poniendo como HideSelection en false, queda en foco siempre la primer linea del listview y no la que edite
-
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
-
antes de editar guarda el indice de la fila que editaste, y despues de actualizar seleccionala de nuevo a traves del indice que guardaste.
-
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
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
-
despues de cargar el listview pones algo asi:
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.
-
Yo lo que hago es después de editar actualizo solo las columnas que ve el usuario.
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.
-
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
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:
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:
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
-
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.