jueves, 1 de abril de 2010

C# - [Winforms] Seleccionar Fila con ENTER – DataGridView y ListView

 

Introducción

Este articulo es mostrara una alternativa de como se puede detectar la presión de una tecla (en este caso el ENTER) en un control determinado, pudiendo así trabajar con la selección.

En el ejemplo se trabajar con dos controles, el DataGridView y un ListView.

Básicamente la técnica para ambos ejemplos será similar, todo el trabajo se realizaría en el método ProcessCmdKey del formulario, (el cual es una sobrecarga), permitiendo atrapar la teclas pulsadas en el formulario, en este además se podrías validar que control esta activo en ese momento y en caso de ser el que resulta útil, procede a trabajar con la selección.

Para ambos ejemplo se permitirá optar (mediante radiobuttons) si la selección del ítem en la lista se mostrar en un mensaje, o será desplegado en otra ventana (formulario).

 

DataGridView - Selección de la fila

Como había comentado todo el trabajo esta en la función:

[C#]

protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
    //
    // Si el control DataGridView no tiene el foco, 
    // se abandonamos el procedimiento, llamando al metodo base
    //
    if ((!dataGridView1.Focused)) 
        return base.ProcessCmdKey(ref msg, keyData);

    //
    // Si la tecla presionada es distinta al ENTER, 
    // se abandonamos el procedimiento, llamando al metodo base
    //
    if (keyData != Keys.Enter) 
        return base.ProcessCmdKey(ref msg, keyData);
    //
    // Obtenemos la fila actual 
    //
    DataGridViewRow row = dataGridView1.CurrentRow;

    if (rbMostrarMensaje.Checked)
    {
        MessageBox.Show(string.Format("Se ha seleccionado, Cuenta:'{0}' Descripcion:'{1}'", 
                                            row.Cells["cuenta"].Value, 
                                            row.Cells["descripcion"].Value));
    }
    else if (rbMostrarForm.Checked)
    {
        int cuenta = Convert.ToInt32(row.Cells["cuenta"].Value);
        string desc = Convert.ToString(row.Cells["descripcion"].Value);

        frmSeleccion frm = new frmSeleccion(cuenta, desc);
        frm.ShowDialog();
    }

    return true;
} 

[VB.NET]

Protected Overloads Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean
	'
	' Si el control DataGridView no tiene el foco, 
	' se abandonamos el procedimiento, llamando al metodo base
	'
	If (Not dataGridView1.Focused) Then
		Return MyBase.ProcessCmdKey(msg, keyData)
	End If

	'
	' Si la tecla presionada es distinta al ENTER, 
	' se abandonamos el procedimiento, llamando al metodo base
	'
	If keyData <> Keys.Enter Then
		Return MyBase.ProcessCmdKey(msg, keyData)
	End If
	'
	' Obtenemos la fila actual 
	'
	Dim row As DataGridViewRow = dataGridView1.CurrentRow

       If rbMostrarMensaje.Checked Then

           MessageBox.Show(String.Format("Se ha seleccionado, Cuenta:'{0}' Descripcion:'{1}'", row.Cells("cuenta").Value, row.Cells("descripcion").Value))

       ElseIf rbMostrarForm.Checked Then

           Dim cuenta As Integer = CInt(row.Cells("cuenta").Value)
           Dim desc As String = CStr(row.Cells("descripcion").Value)

           Dim frm As New frmSeleccion(cuenta, desc)
           frm.ShowDialog()

       End If

	Return True
End Function

- El primer punto es detectar si al presionar la tecla el foco lo tiene el control que se quiere trabajar, en este caso el DataGridView

- El segundo paso es determinar si la tecla presionada por el usuario es la que se desea controlar, en este caso será el ENTER

Si las dos validaciones anteriores pasaron, se puede recuperar la fila seleccionada en la grilla, y trabajar con la información que esta proporcione.

 

[C#]
[VB.NET]

 

ListView – Selección de la fila

La única diferencia entre este código y el usado en el DataGridview, será la forma en que se obtiene el ítem seleccionado.

Las validaciones en cuanto a la tecla presionada, y el foco en el control activo son idénticas para ambos casos.

[C#]

protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
    //
    // Si el control DataGridView no tiene el foco, 
    // se abandonamos el procedimiento, llamando al metodo base
    //
    if ((!listView1.Focused)) 
        return base.ProcessCmdKey(ref msg, keyData);

    //
    // Si la tecla presionada es distinta al ENTER, 
    // se abandonamos el procedimiento, llamando al metodo base
    //
    if (keyData != Keys.Enter) 
        return base.ProcessCmdKey(ref msg, keyData);

    //
    // Sino hay item seleccinado en la lista
    // se abandonamos el procedimiento, llamando al metodo base
    //
    if(listView1.SelectedItems.Count == 0)
        return base.ProcessCmdKey(ref msg, keyData);

    //
    // Obtenemos la fila actual 
    //
    ListViewItem item = listView1.SelectedItems[0]; 

    if (rbMostrarMensaje.Checked)
    {
        MessageBox.Show(string.Format("Se ha seleccionado, Cuenta:'{0}' Descripcion:'{1}'",
                                            item.Text,
                                            item.SubItems[1].Text));
    }
    else if (rbMostrarForm.Checked)
    {
        int cuenta = Convert.ToInt32(item.Text);
        string desc = Convert.ToString(item.SubItems[1].Text);

        frmSeleccion frm = new frmSeleccion(cuenta, desc);
        frm.ShowDialog();
    }

    return true;
} 

[VB.NET]

Protected Overloads Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean
	'
	' Si el control DataGridView no tiene el foco, 
	' se abandonamos el procedimiento, llamando al metodo base
	'
	If (Not listView1.Focused) Then
		Return MyBase.ProcessCmdKey(msg, keyData)
	End If

	'
	' Si la tecla presionada es distinta al ENTER, 
	' se abandonamos el procedimiento, llamando al metodo base
	'
	If keyData <> Keys.Enter Then
		Return MyBase.ProcessCmdKey(msg, keyData)
	End If

	'
	' Sino hay item seleccinado en la lista
	' se abandonamos el procedimiento, llamando al metodo base
	'
	If listView1.SelectedItems.Count = 0 Then
		Return MyBase.ProcessCmdKey(msg, keyData)
	End If

	'
	' Obtenemos la fila actual 
	'
	Dim item As ListViewItem = listView1.SelectedItems(0)

       If rbMostrarMensaje.Checked Then

           MessageBox.Show(String.Format("Se ha seleccionado, Cuenta:'{0}' Descripcion:'{1}'", item.Text, item.SubItems(1).Text))

       ElseIf rbMostrarForm.Checked Then

           Dim cuenta As Integer = CInt(item.Text)
           Dim desc As String = CStr(item.SubItems(1).Text)

           Dim frm As New frmSeleccion(cuenta, desc)
           frm.ShowDialog()

       End If

       Return True

End Function

 

[C#]
[VB.NET]

39 comentarios:

  1. Que tal alejandro esta muy interesante tu articulo, tengo una duda como le haga para que cuando este en modo edicion dentro de una celda de un DataGridview al perder el focus con el Mouse o sea que no este dentro de la celda salga del modo edicion asi como cuando se selecciona una fila.

    saludos.

    ResponderEliminar
  2. hola que tal

    bien, en realidad este articulo en particular no apunta a la edicion de las celdas en un datagridview, sino mas bien a la seleccion de una fila del control.

    Igualmente con respecto a la pregunta, puedo comentar que hay que diferenciar el cursor, del puntero del mouse, cuando se habla de la edicion de la celda de la grilla, son cosas distintas

    La edicion implica presionar sobre la celda para situar el cursor, pero nada impide quitar el puntero de la celda y moverlo hasta otra celda y se pulse en esta, provocando la enulacion de la edicion de la actual y pasando a editar una nueva.

    La verdad no creo que exista un evento que quite la edicion de una celda con solo mover el mouse por fuera de la celda seleccionada, ademas es un requerimiento algo extraño, ya que se puede candelar la edicion presionado la tecla Esc, que es bien rapido.

    Tienes en la grilla eventos del mouse como ser el CellMouseLeave que por ahi podria ayudar, por ahi en este evento usar el metodo:
    DataGridView.EndEdit (Método)

    Aqui puedes consultar la lista de eventos :
    DataGridView (Eventos)

    bueno la verdad no se si respidi a tu pregunta, o por ahi al menos di una pista

    saludos

    ResponderEliminar
  3. Muchas gracias Leandro, si me diste la idea pero he estado batallando un poco con esto te explico con mas detalles: Lo que qiero hacer es que al momento de estar en la ultima celda cuando estoy editando la celda (en Modo Edit, en la fila aparece con un Lapiz) al presionar en un boton Guardar me marca error, pero de esta misma manera, depues de terminar de editar una celda me coloco al principio de la fila le doy guardar y no marca ningun error, cabe mencionar que Tab lo estoy ocupando para recorrer cada una de las celdas y el el enter para recorrer hacia habajo.

    img 1: http://img30.imageshack.us/i/90250120.jpg/
    img 2: http://img88.imageshack.us/i/74553816.jpg/

    Saludos

    ResponderEliminar
  4. hola

    En realidad estaria bueno contar con el mensaje de error que estas obteniendo, eso ayudaria a ver si la causa es del datagridview o del metodo que graba los datos.

    Suele pasa que la grilla no asigne el valor a la celda hasta que no se salga del modo edicion, si por alguna casualidad el boton esta intentando obtener el valor de la celda cuando aun no se asigno, este podria fallar.

    Agregar un breakpoint en el codigo donde realizar el guardado o insert de los datos, y valida que valor estas recuperando en la celda esta que editas, puede que tengas un null como valor y esto genere la falla al no contemplarlo.

    saludos

    ResponderEliminar
  5. Bien, Muchas Gracias Lenadro

    ResponderEliminar
  6. Hola Alejandro, estoy usando ahora el datagridview en modo edición, sólo he habilitado 2 columnas para editar. Todo funciona bien, he agregado eventos al datagridTexbox, pero lo que hasta ahora no me funciona es: al terminar de editar una celda doy enter y avanzo a la siguiente fila, pero no ejecuta mi método. El metodo lo he puesto en la opción key_up de la celda a editar, pero nada. Sin embargo, cuando uso el key_press si me funciona (pero solo la función de validar entradas de la celda, como numero y letras... he intentado esccribir " if Convert.ToInt32(e.KeyChar) = Convert.ToInt32(Keys.Enter) then: miMetodo" nunca entra), pero en el key_down pongo e.keydata=key.enter y nada, nunca llego a entrar. el enter me salta a la siguiente fila sin realizar nada. Por último, he puesto mi método en la opción cellcontent_click, alli funciona, pero cuando vuelvo a regresar jaja. espero te hayas tocado con un problema similar para que me ayudes un poco. Saludos

    ResponderEliminar
  7. hola zynid3as

    Algo que no me quedo claro es porque necesitas usar el keypress o keyup, si en el articulo se hace referencia al uso del ProcessCmdKey, como medio para detectat la presion de una tecla en la grilla.

    O quizas hagas referencia a este otro ejemplo:

    DataGridView – KeyPress detectar ENTER y busqueda

    En este si uso el Key_Up y se detecta el enter.

    Nota: tengo un problemita con skydrive en algunos articulo, vere el fin de de semana de actualizar los ejemplos.

    saludos

    ResponderEliminar
  8. Hola Leandro, pues a duras penas estoy haciendo funcionar mi datagridview y ahora lo que necesito es saber como puedo regresar a la primera fila. Te explico, si estoy en la última fila y presiono enter o flecha abajo debo de regresar a la primera fila algo asi como un bucle de avance dentro del datagridview. Espero me puedas ayudar.

    ResponderEliminar
  9. muy buen tu articulo fue de gran ayuda, muchas gracias y continua con lo que haces eres muy bueno

    ResponderEliminar
  10. Sin palabras, el aporte que realizas con estas publicaciones, claras y concretas, En este caso me ha ayudado mucho en el manejo de un datagridview, me pregunto que pasa cuando tengo dos datagridview en el mismo form, tipo maestro/detalle, como utilizo la funcion ProcessCmdKey, porque en el ejemplo se refiere a un solo datagridview.
    Gracias

    ResponderEliminar
  11. hola El edu

    El metodo seria el mismo ProcessCmdKey, este no piuedes cambiarlo porque es una sobrecarga del implementado por el formulario

    Pero dentro del evento se detecta que grid esta activo, o sea tiene el foco.

    Si tienes dos grid podrias usar:


    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
    {
    DataGridView activeGrid = null;

    if (!(dataGridView1.Focused || dataGridView2.Focused))
    return base.ProcessCmdKey(ref msg, keyData);

    if (dataGridView1.Focused)
    activeGrid = dataGridView1;

    if (dataGridView2.Focused)
    activeGrid = dataGridView2;

    //continuas de forma estandar
    // pero usando activeGrid para referenciar el grid activo

    .
    .
    .
    }


    O sea, el primer "if" valida que algunas de las dos grid tenga el foco, si una lo tiene luego se determina cual, asignandola a una variable comun que se usara en el resto del codigo.

    saludos

    ResponderEliminar
  12. Hola Leandro!!

    Te quiero molestar con una consulta!

    Resulta que implementé el método

    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)

    y funciona todo casi perfectamente excepto que cuando el programa apenas entra en dicho método, el "dataGridView1.Focused" automáticamente pasa a false aunque este dentro del datagridview y no procesa correctamente las condiciones, obviamente si quito dicha restricción, hace el proceso destinado al datagridview en cualquier otro control, y creo que eso me puede causar problemas.

    Lo curioso es bajé tu ejemplo lo compilé y funcionó perfectamente tal y como debe de ser, copie el código a mi proyecto y me volvió a dar ese fallo. Traté de reproducir el error en tu proyecto para determinar cual era mi fallo y nunca lo logré.

    En tu experiencia, ¿que crees que estoy haciendo mal? tal ves alguna propiedad mal seteada, algún evento indebido...

    Me estoy volviendo loco con este asunto...

    Por cierto, una observación de novato... para intentar resolver este problema genere una variable bool datagridEnfocado la cual seteaba a true en el evento datagridview_enter y en false en el dgv_leave, intentando leerla desde dentro del método para saber si el dgv estaba en foco, sin embargo obtenía una advertencia de código no accesible. No se si esto sirva de pista para entender el error.

    De antemano muchas gracias :D

    ResponderEliminar
  13. Hola nuevamente!!

    Acabo de resolver parte del misterio, aunque no lo mas importante.

    El aviso de código inaccesible aparentemente era porque la classe de mi Form provenía de otra clase heredada de Form, es decir heredaba la clase Form a myForm, y después Form_conDGV heredaba de myForm. Apenas cambie de Form_conDGV : myForm a Form_conDGV : Form y desapareció el aviso de código inaccesible. Sin embargo persiste el problema del dataGridView1.Focused en false al entrar al método ProcessCmdKey este o no dentro del datagridview.

    Salu2

    ResponderEliminar
  14. hola leandro soy nueva en (c#)esto y queria saber como hago pasar la informaacion que me muesta un listview(de busqueda de clientes) varios texbox(txtnombre, txtcod_cli ah estos los tengo que llevar).
    El form que tengo es de cliente y con una busqueda los deberia traer.
    saludos gracias
    Mari

    ResponderEliminar
  15. hola Mariana

    no se si entendi el planteo, porque dices que tiene un listview y textbox, pero cuando haces referencia a traer seria la accion de seleccionar un item en el listview y cargas los textbox

    o la de traer los cliente en el listview para listarlos ?

    saludos

    ResponderEliminar
  16. Que tal Leandro, bueno el articulo, queria hacerte una consulta, cual es la diferencia de hacer lo mismo en el metodo por ejemplo key up de la grilla??.

    ResponderEliminar
  17. hola

    algunas ventajas que veo

    - puede aplicar el mismo concepto a varios controles, como veras el codigo es muy parecido para el datagridview, como para el listview.
    Hacerlo mediante KeyUp seria concreto para cada control y muy diferente.

    - te evitas tener que adjuntar y desvincular eventos cuando las celdas entran en edicion esto es directo si tiene el foco ese control y se presional tal letra se aplica la logica


    tengo un ejemplo de la otra tecnica

    [DataGridView] KeyPress detectar ENTER y búsqueda

    veras que no queda tan lindo en el codigo

    saludos

    ResponderEliminar
  18. Hola Leandro Disculpa que te moleste y el atrevimiento que me tomo para pedirte que me ayudes o me orientes respecto al tema "ListView, como usarlos y pasar ítems entre ellos" en el que yo quisiera que la fila seleccionada del ListView se pasara a un DataGridView y con un botón se guardara en una base de datos. He intentado con el codigo que publicaste hacer esto, pero en el DataGridView no me aparece el item que seleccione en el ListView. Estoy realizando un sistema de pagos,en el que, el ListView contiene las siguientes columnas(vencimiento, concepto,mes colegiatura,descuentos,total) y en el DataGridView (Fechadepago,concepto,mes,importe,descuento,recargos, totalimporte). Espero que me puedas ayudar, sino de todas formas muchas gracias.

    ResponderEliminar
  19. hola radx

    pero porque haces eso de mezclar un listview con un datagridview, no creo que sea buena idea

    cuando se diseña se supone que se sigue un estilo, mezclar estos controles rompe un poco con eso, porque no usas dos datagridview que seria lo correcto

    saludos

    ResponderEliminar
  20. Hola Leandro

    No tenia idea de que fuera demasiado loco lo queintentaba, pero he decidido tomar como base el ejemplo que pones de los dos ListView,la verdd soy nuevo en esto pero estoy intentandolo. He estado tratando de almacenar la fila del ListView2 por asi llamarlo en una base de datos pero no logro hacerlo tengo esto:

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click


    Using cnn As New OleDbConnection("Provider=SQLOLEDB.1;" & _
    "Integrated Security=SSPI; " & _
    "Persist Security Info=False;" & _
    "User ID=usuario;" & _
    "Initial Catalog=proyecto;" & _
    "Data Source=(local)\SQLEXPRESS")


    Dim query As String = "INSERT INTO pagos (Concepto, Fecha,Colegiatura,Total) " & _
    "VALUES (@Concepto, @Fecha, @Colegiatura, @Total)"


    Dim cmd As New OleDbCommand(query, cnn)

    For Each item As ListViewItem In ListView2.Items

    cmd.Parameters.AddWithValue("@Concepto", item.Text)
    cmd.Parameters.AddWithValue("@Fecha", item.Text)
    cmd.Parameters.AddWithValue("@Colegiatura", item.Text)
    cmd.Parameters.AddWithValue("@Total", item.Text)


    Next

    End Using


    End Sub

    No almacena en la bd que esta mal??

    ResponderEliminar
  21. hola radx

    te estan faltando dos lineas

    For Each item As ListViewItem In ListView2.Items

    cmd.Parameters.Clear()

    cmd.Parameters.AddWithValue("@Concepto", item.Text)
    cmd.Parameters.AddWithValue("@Fecha", item.Text)
    cmd.Parameters.AddWithValue("@Colegiatura", item.Text)
    cmd.Parameters.AddWithValue("@Total", item.Text)

    cmd.ExecuteNonQuery()

    Next

    saludos

    saludos

    ResponderEliminar
  22. Hola Leandro

    Porque me sale un cuadro de dialogo que dice: "Especificación de autorización no válida" al momento de intentar insertar datos a la base de datos??

    Este es el codigo que tengo

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If dgvSeleccion.Rows.Count = 0 Then
    Return
    End If

    Using Conn As New OleDbConnection("Provider=SQLOLEDB; Data Source=Productos.mdb;Persist Security Info=True")
    Try
    Dim Sql As String = "INSERT INTO pagos (concepto, fechapago) VALUES (@concepto, @fechapago)"

    Conn.Open()
    Dim cmd As New OleDbCommand(Sql, Conn)

    For Each row As DataGridViewRow In dgvSeleccion.Rows

    If String.IsNullOrEmpty(CStr(row.Cells("DescripcionSel").Value)) Or _
    String.IsNullOrEmpty(CStr(row.Cells("PrecioUnitarioSel").Value)) Then

    Continue For

    End If

    cmd.Parameters.Clear()

    cmd.Parameters.AddWithValue("@concepto", CStr(row.Cells("DescripcionSel").Value))
    cmd.Parameters.AddWithValue("@fechapago", CStr(row.Cells("PrecioUnitarioSel").Value))

    cmd.ExecuteNonQuery()
    Next


    'Dim cdo As New OleDbCommand(Sql, Conn)
    cmd.ExecuteNonQuery()
    'visualizar el registro
    Dim da As New OleDbDataAdapter("SELECT * From pagos", Conn)
    Dim ds As New DataSet

    da.Fill(ds, "pagos")

    With DataGridView1
    .DataSource = ds.Tables("pagos")
    .Refresh()
    End With

    Catch ex As Exception
    MsgBox(ex.Message.ToString)

    Finally
    Conn.Close()
    End Try
    End Using

    End Sub

    ResponderEliminar
  23. hola radx

    porque usas OleDb con una base de datos Sql server?

    porque no usas las librterias de .ent para sql server que estan optimizadas para este

    o sea usar las clase SqlConnection, SqlCommand, SqlDataAdapter, etc
    esas son las clases que deberias usar

    saludos

    ResponderEliminar
  24. Hola Leandro, gracias por tus megaaportes, me son muy utiles ahora que empiezo con el VB.net y manejo de los datagridview.
    Solo una consulta, no se si no he buscado bien pero ¿No tienes ejemplos de agregado o edición de datos directamente en los datagridview? hasta ahora solo he visto los de validacion de datos y demas, no se si no lo he buscado bien pero aun no lo he visto, muchas gracias :)

    ResponderEliminar
  25. hola Bianconeri

    no soy muy partidaria de editar directo en el datagridview, pero esta funcionalidad es automatica

    o sea sino esta el grid con el ReadOnly en true, deberias poder editar directamente, cuando te posiciones en una celda puede escribir alli, podrias tomar los cambios si haces

    DataTable dt = GridView1.DataSource as DataTable;

    ese datatable tendra los cambiso que hicieras en el grid porque el control impacta directo en el objeto que asignas como origen de datos

    saludos

    ResponderEliminar
  26. Hola Leandro tengo un Panel control con un datagrid, hice que el panel saliera de forma emergente (como un pop up) pero siempre se ubica en el foco del panel como puedo hacer que se me ubique en el datagrid para que me habilite seleccionar la fila con el enter?

    ResponderEliminar
  27. hola

    no has evaluado poner el foco en el grid y seleccionar una celda

    podrias ahcer esto en el form_load si lo necesitas

    usarias el metodo focus() y sino funciona usa primero el metodo Select() (y despues el focus())

    saludos

    ResponderEliminar
  28. Estoy creando un DatagridView en visual studio 2010 y quiero poner un titulo a este datagridview(arriba del todo del datagridview:
    me.grdDtos.CaptionText="Customers"

    CaptionText no me vale ¿Qué debería utilizar ,hacer??¿que método tengo que utilizar?
    Gracias.

    ResponderEliminar
  29. hola

    respondi en el foro

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/9f4f3283-083e-46a7-a578-d8b0e83fbc49

    saludos

    ResponderEliminar
  30. Hola Leandro, cual es la diferencia entre esto que planteas y en usar el evento KeyDown, yo estoy usando dicho evento para hacer este tipo de cosas.. O es lo mismo? Saludos

    ResponderEliminar
  31. hola Si Señor

    hay varias formas de lograr el mismo objetivo

    el uso de ProcessCmdKey aporta que al ser un evento global del form pueda controlar mejor las acciones tengan el foco o no, ya que toda accion de teclado lanzara ese metodo

    pero si en tu caso lo pudiste implementar con el KeyDown tambien es valido

    saludos

    ResponderEliminar
  32. Hola Leandro gracias una vez mas por tus grandes aportes, me funciono tu ejemplo yo lo estoy aplicando en un ejemplo de cabecera-detalle que al recorrer un datagridview y al presionar enter en la fila seleccionada cargue otro datagridview con los detalles del primero y me funciona muy bien.
    Pero tengo una duda, si mi ejemplo se puede hacer pero con las teclas keys.UP y keys.DOWN, cómo controlo que sean cualquiera de las 2 teclas? Ya lo estuve intentando solo con key.DOWN mostrando un mensaje, lo cual funciono pero nunca cambio de fila, siempre se mantubo en la primera. Gracias de ante mano por tu tiempo y tu ayuda

    ResponderEliminar
  33. hola Patricio

    es que el cambio de fila deberias programarlo, o sea al detectar que se presiona el boton de DOWN deberias ver si hay una fila seleccionada y cambiar la seleccion al index - 1, o sea al index actual le restas uno asi va hacia abajo y esa es la fila que marcas seleccionada

    usarias la propiedad
    DataGridViewRow.Selected Property

    lo mismo haces con el UP solo que sumando uno, ademas agrega validaciones cuando llegues al ultimo y al primer registro para que no falle y te vayas fuera de rango

    saludos

    ResponderEliminar
  34. Hola Alejandro, no se si es por aca que ddebo consultar, pero por las dudas lo hago (arriba dice comentario). Tengoun listview que controla la entrada de teclas presionadas, solo una de las celdas es editable, y es rarisimo lo que me sucede, cuando aprieto la telca del uno, me cambia de fila. solo con esa tecla, tando del teclado numerico como el teclado alfabetico. llevo horas revisando y no encuentro por que. A ti se te ocurre algo? desde ya muchas gracias.

    ResponderEliminar
  35. hola ciganda121

    que seria exactamente que te cambia la fila ? por que cosa la cambia

    no has evaliado usar un control mejor como ser el DataGridView, si vas a mostrar datos como table y quieres editar es muchoi mejor que el listview

    saludos

    ResponderEliminar
  36. Felicitaciones!!! @Leandro buen articulo.

    ResponderEliminar
  37. Hola leandtro que tal, Tengo un problema, y es que cuando estoy editando la última fila del DataGridView y presiono la tecla enter produce un error. Y no puedo encontrarle la vuelta. Tendrás alguna solución para esto? Gracias

    ResponderEliminar
  38. Ya logré solucionarlo. Era otro el problema. Muchas gracias.

    ResponderEliminar