none
¿Cómo se puede obtener el valor original de una celda del DataGridView? RRS feed

  • Pregunta

  • Suponiendo que la celda que voy a editar tiene un valor, si la empiezo a editar y presiono Esc se restituye su valor original o sea el que tenía antes que empiece a editar la celda.

    Mi pregunta es ¿Qué propiedad me devuelve ese valor original? ¿o cómo puedo acceder a él vía código?

    jueves, 4 de febrero de 2016 18:32

Respuestas

  • "James-2016" escribió:

    > ... me frustra un poco, que al parecer siguen sin entenderme.

    Yo creo que sí se te ha entendido bien. Lo mismo puede que tú no hayas entendido la respuesta del usuario Hugo Gil. ;-)

    > Cuando estas editando el valor de una celda, el valor viejo (por así decirlo ya
    > no está visible), pero si pulso Esc vuelve a estar visible, o sea mientras estás
    > editando la celda el valor viejo queda en alguna parte, la pregunta es cómo
    > acceder a él en ese momento vía programa.

    Ese valor "viejo" (por así decirlo), se almacena en la propiedad Value de un objeto DataGridViewCell que se corresponde con la celda actualmente activa, el cual podrás referenciar consultando el valor de la propiedad CurrentCell del control DataGridView:

        ' Celda actual
        Dim currentCell As DataGridViewCell = DataGridView1.CurrentCell
    
        ' Valor de la celda
        Dim valor As Object
    
        If (Not currentCell Is Nothing) Then
            valor = currentCell.Value
        End If
    
        MessageBox.Show(Convert.ToString(valor))
    

    Pero, ¡claro! Dependiendo de donde ejecutes ese código, obtendrás un valor u otro.

    Si cancelas la edición de la celda pulsando la tecla Escape, todos los valores que has escrito en las distintas celdas de una fila cualquiera se eliminan, quedando como valor de las celdas aquellos que tienen actualmente. Es cuando confirmas los cambios (por ejemplo, al cambiar de fila), cuando se sobrescribe los "valores viejos" de las celdas por aquellos "valores nuevos" que has escrito en ellas. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    sábado, 6 de febrero de 2016 10:21
    Moderador
  • "James-2016" escribió:

    > A ver si entendí: por lo que me explica, aún cuando esté editando la celda
    > el valor de la propiedad Value de esa celda se conserva hasta que confirme
    > el cambio? es decir hasta que cambie de fila por ejemplo?
    >
    > Si es así entonces estando en la misma fila, pero pasando a otra columna
    > (y por tanto dejando de editar la columna anterior)  y aun viendo en pantalla
    > el valor recien ingresado en esa columna, la propiedad value seguirá teniendo
    > el valor previo de dicha columna?
    >
    > Si es así, es eso lo que quería saber.

    Efectivamente, ahora sí lo has entendido. ;-)

    Tienes que confirmar los cambios efectuados en una celda cualquiera, bien cambiando de fila, bien ejecutando el método CommitEdit del control DataGridView en su evento CurrentCellDirtyStateChanged, del cual ya te mostré un ejemplo en la siguiente pregunta:

    Cómo puedo forzar que se actualice la fila modificada del datagridview sin cambiar de linea


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta James-2016 lunes, 8 de febrero de 2016 8:45
    lunes, 8 de febrero de 2016 7:49
    Moderador
  • Que tal amigo.

    No es que ese valor se guarde en algún lado, mas bien que al editar una celda, y presionar ESC, no guarda el dato, y por ende te deja el original, ese dato se sobrescribe o guarda hasta que presionas enter.

    Si lo que quieres es saber el valor original que tenia antes de ingresar cualquier valor, lo que podrias hacer es un select con Linq , al DataTable que es el origen de datos de tu Grid.

    Saludos.


    Hugo Gil


    jueves, 4 de febrero de 2016 19:28

Todas las respuestas

  • Al llenar un DataGridView es un "espejo" de la tabla de tu base de datos. Es posible hacer ediciones por medio de Clicks o con el tabulador y te va a dejar tus cambios solo mientras estés corriendo tu programa, al momento de cerrarlo se vuelve a llenar con los datos de la tabla y esos no se editan a menos que tu lo programes antes, existen maneras que puedas grabar tus cambios me comentas si eso esa es tu intención para echarte la mano, espero que mi respuesta te ayude SALUDOS!!!
    jueves, 4 de febrero de 2016 18:51
  • Gracias por responder, entiendo que eso es así, efectivamente si cargo una tabla los datos no se reflejan en esta a menos que vía programa haga lo necesario para enlazarla o en su defecto vaciar nuevamente los datos del DataGridView a la tabla.

    Pero mi pregunta no va por allí, a lo mejor no se entendió, vuelvo a plantearla:

    ----------------------------------------------------------------------------------------------------------------------

    En un data grid mostrado en pantalla, sin importar de dónde provengan los datos que tiene, (es decir no importa si está enlazado a datos o no), cuando se edita una celda tiene el siguiente comportamiento:

    Suponiendo que en la primera fila y primera columna tiene el valor 10 empiezo a escribir y pongo 20 pero me desanimo y presiono Esc ¿cómo responde el DataGridView cuando presiono Esc? Rpta. llena la celda con el valor 10 (que es el valor que tenia antes que empiece a editar la celda).

    Ese valor no es que se lo inventa, lo tiene guardado en algún lado, lo que quiero saber es ¿dónde? es decir cómo accedo a ese valor. Tiene que estar en alguna propiedad de la celda o debe haber alguna manera de acceder a él.

    Esa es mi pregunta, ojalá ahora sí se haya entendido.

    jueves, 4 de febrero de 2016 19:06
  • Que tal amigo.

    No es que ese valor se guarde en algún lado, mas bien que al editar una celda, y presionar ESC, no guarda el dato, y por ende te deja el original, ese dato se sobrescribe o guarda hasta que presionas enter.

    Si lo que quieres es saber el valor original que tenia antes de ingresar cualquier valor, lo que podrias hacer es un select con Linq , al DataTable que es el origen de datos de tu Grid.

    Saludos.


    Hugo Gil


    jueves, 4 de febrero de 2016 19:28
  • Hola gracias por responder y por la buena voluntad de ayudar pero me frustra un poco, que al parecer siguen sin entenderme.

    Suponiendo que la tabla no esté enlazada, el comportamiento es el mismo.

    Si ingreso un valor y paso a otra celda queda ese valor, si nuevamente lo edito y pulso ESC retorna su valor inicial.

    Lo pongo de otra forma:

    Cuando estas editando el valor de una celda, el valor viejo (por así decirlo ya no está visible), pero si pulso Esc vuelve a estar visible, o sea mientras estás editando la celda el valor viejo queda en alguna parte, la pregunta es cómo acceder a él en ese momento vía programa.

    jueves, 4 de febrero de 2016 20:15
  • "James-2016" escribió:

    > ... me frustra un poco, que al parecer siguen sin entenderme.

    Yo creo que sí se te ha entendido bien. Lo mismo puede que tú no hayas entendido la respuesta del usuario Hugo Gil. ;-)

    > Cuando estas editando el valor de una celda, el valor viejo (por así decirlo ya
    > no está visible), pero si pulso Esc vuelve a estar visible, o sea mientras estás
    > editando la celda el valor viejo queda en alguna parte, la pregunta es cómo
    > acceder a él en ese momento vía programa.

    Ese valor "viejo" (por así decirlo), se almacena en la propiedad Value de un objeto DataGridViewCell que se corresponde con la celda actualmente activa, el cual podrás referenciar consultando el valor de la propiedad CurrentCell del control DataGridView:

        ' Celda actual
        Dim currentCell As DataGridViewCell = DataGridView1.CurrentCell
    
        ' Valor de la celda
        Dim valor As Object
    
        If (Not currentCell Is Nothing) Then
            valor = currentCell.Value
        End If
    
        MessageBox.Show(Convert.ToString(valor))
    

    Pero, ¡claro! Dependiendo de donde ejecutes ese código, obtendrás un valor u otro.

    Si cancelas la edición de la celda pulsando la tecla Escape, todos los valores que has escrito en las distintas celdas de una fila cualquiera se eliminan, quedando como valor de las celdas aquellos que tienen actualmente. Es cuando confirmas los cambios (por ejemplo, al cambiar de fila), cuando se sobrescribe los "valores viejos" de las celdas por aquellos "valores nuevos" que has escrito en ellas. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    sábado, 6 de febrero de 2016 10:21
    Moderador
  • jaja OK, lo siento, a lo mejor fui yo el que no entendí la respuesta.

    Hacía la pregunta porque buscaba una propiedad equivalente a OldValue que entiendo había en VB6.

    A ver si entendí: por lo que me explica, aún cuando esté editando la celda el valor de la propiedad Value de esa celda se conserva hasta que confirme el cambio? es decir hasta que cambie de fila por ejemplo?

    Si es así entonces estando en la misma fila, pero pasando a otra columna (y por tanto dejando de editar la columna anterior)  y aun viendo en pantalla el valor recien ingresado en esa columna, la propiedad value seguirá teniendo el valor previo de dicha columna?

    Si es así, es eso lo que quería saber.


    lunes, 8 de febrero de 2016 5:50
  • "James-2016" escribió:

    > A ver si entendí: por lo que me explica, aún cuando esté editando la celda
    > el valor de la propiedad Value de esa celda se conserva hasta que confirme
    > el cambio? es decir hasta que cambie de fila por ejemplo?
    >
    > Si es así entonces estando en la misma fila, pero pasando a otra columna
    > (y por tanto dejando de editar la columna anterior)  y aun viendo en pantalla
    > el valor recien ingresado en esa columna, la propiedad value seguirá teniendo
    > el valor previo de dicha columna?
    >
    > Si es así, es eso lo que quería saber.

    Efectivamente, ahora sí lo has entendido. ;-)

    Tienes que confirmar los cambios efectuados en una celda cualquiera, bien cambiando de fila, bien ejecutando el método CommitEdit del control DataGridView en su evento CurrentCellDirtyStateChanged, del cual ya te mostré un ejemplo en la siguiente pregunta:

    Cómo puedo forzar que se actualice la fila modificada del datagridview sin cambiar de linea


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta James-2016 lunes, 8 de febrero de 2016 8:45
    lunes, 8 de febrero de 2016 7:49
    Moderador