none
Mostrar registro eliminado de DataTable

    Frage

  • Buenas,

    dentro de un DataTable, elimino una fila con Dt.rows(fila).delete. En principio la fila se puede recuperar hasta que no acepte los cambios con el DataAdapter, pero no veo esa fila (en un Datagrid enlazado a Dt).

    Hay alguna manera para que se vea esa fila? Tengo una imagen que cambia con el estado de cada fila, gracias a la propiedad DataRowState, pero la eliminada "desaparece" y no se como mostrarla.

    Gracias,

    David
    Mittwoch, 14. Dezember 2011 18:25

Antworten

  • "David Lopez Sierra" escribió:

    > los nuevos de una manera (un *, por ejemplo), los actualizados
    > de otra (un lápiz, por ejemplo) y los eliminados desactivando
    > ese registro.

    Pero para desactivar el registro no necesitas eliminarlo del objeto DataTable.

    Si por ejemplo desactivas el registro cuando el usuario pulsa la tecla Supr, lo puedes hacer de sólo lectura (desactivar, si prefieres) de la siguiente manera:

        Protected Overrides Function ProcessCmdKey( _
            ByRef msg As Message, keyData As Keys) As Boolean
    
            ' Si el control DataGridView no tiene el foco,
            ' abandonamos el procedimiento.
            '
            If (Not (DataGridView1.Focused)) Then _
                Return MyBase.ProcessCmdKey(msg, keyData)
    
            ' Si se ha pulsado la tecla Supr, deshabilitamos
            ' la fila actual del control DataGridView.
            '
            If (keyData = Keys.Delete) Then
                DataGridView1.CurrentRow.ReadOnly = True
            End If
    
            Return MyBase.ProcessCmdKey(msg, keyData)
    
        End Function
    


    Inserta el procedimiento en el formulario que contiene el control DataGridView.

    Obivamente, en alguna otra parte del formulario tendrás que volver a activar la fila del control DataGridView (ReadOnly = False) cuando así lo estimes oportuno.

     


    Enrique Martínez
      [MS MVP - VB]

    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, activa la instrucción Option Strict.

    Donnerstag, 15. Dezember 2011 20:43

Alle Antworten

  • hola

    es que deberias usar

    DataTable.GetChanges (Método)

    veras que puedes definri que estado recuperar

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Mittwoch, 14. Dezember 2011 18:34
  • Buenas,

     

    veo que con GetChanges puedo recuperar/saber el registro eliminado a una nueva Datatable, pero si el DataTable principal lo tengo asociado a un DataGrid... ¿Como haria en el momento de la eliminación para que se muestre en el Datagrid y no afecte luego a la grabación? Porque si hago esto...

    table.Rows(BindingManagerBase.Position).Delete()

    Dim changeTable As DataTable = table.GetChanges(DataRowState.Deleted)

    ...

    Como relaciono el table con el changeTable y el DataGrid?

    David

    Donnerstag, 15. Dezember 2011 09:02
  • "David Lopez Sierra" escribió:

    > dentro de un DataTable, elimino una fila con Dt.rows(fila).delete.
    > En principio la fila se puede recuperar hasta que no acepte los
    > cambios con el DataAdapter, pero no veo esa fila
    > (en un Datagrid enlazado a Dt).
    >
    > Hay alguna manera para que se vea esa fila? Tengo una imagen que
    > cambia con el estado de cada fila, gracias a la propiedad
    > DataRowState, pero la eliminada "desaparece" y no se como mostrarla.

    Hola, David:

    ¡Vamos a ver! Si llamas al método Delete de un objeto DataRow, la fila se marca como "eliminada", y desaparece de todos aquellos controles que se encuentren enlazados al objeto DataTable al que pertenece la fila u objeto DataRow eliminado, aparte que no se puede tener acceso a la información de una fila eliminada.

    ¿Quieres que la fila se vea de nuevo? Llama al método RejectChanges de aquel objeto DataRow que has eliminado:

       dataRow.RejectChanges()

    Pero eso de que se elimine la fila pero por otra parte "que se vea esa fila", como que va a ser complicado de conseguirlo. ;-)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    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, activa la instrucción Option Strict.


    Donnerstag, 15. Dezember 2011 17:04
  • Merci por la respuesta Enrique,

    la verdad es que yo quería conseguir que se vieran todos los cambios que se hace en un conjunto de registros marcándolos, los nuevos de una manera (un *, por ejemplo), los actualizados de otra (un lápiz, por ejemplo) y los eliminados desactivando ese registro. Lo quiero hacer de esa manera para que en cualquier momento se pueda deshacer los cambios y, claro está, si has eliminado un registro y no lo ves es más complicado deshacer ese cambio ;) Lo hago así porque después puedes guardar todos los cambios a la vez.

    Así que supongo que tendré que cambiar la manera de hacerlo (aunque no me gusta poner el típico mensaje de "¿Seguro que lo quieres eliminar?").

    Gracias,

    David

    Donnerstag, 15. Dezember 2011 19:41
  • "David Lopez Sierra" escribió:

    > los nuevos de una manera (un *, por ejemplo), los actualizados
    > de otra (un lápiz, por ejemplo) y los eliminados desactivando
    > ese registro.

    Pero para desactivar el registro no necesitas eliminarlo del objeto DataTable.

    Si por ejemplo desactivas el registro cuando el usuario pulsa la tecla Supr, lo puedes hacer de sólo lectura (desactivar, si prefieres) de la siguiente manera:

        Protected Overrides Function ProcessCmdKey( _
            ByRef msg As Message, keyData As Keys) As Boolean
    
            ' Si el control DataGridView no tiene el foco,
            ' abandonamos el procedimiento.
            '
            If (Not (DataGridView1.Focused)) Then _
                Return MyBase.ProcessCmdKey(msg, keyData)
    
            ' Si se ha pulsado la tecla Supr, deshabilitamos
            ' la fila actual del control DataGridView.
            '
            If (keyData = Keys.Delete) Then
                DataGridView1.CurrentRow.ReadOnly = True
            End If
    
            Return MyBase.ProcessCmdKey(msg, keyData)
    
        End Function
    


    Inserta el procedimiento en el formulario que contiene el control DataGridView.

    Obivamente, en alguna otra parte del formulario tendrás que volver a activar la fila del control DataGridView (ReadOnly = False) cuando así lo estimes oportuno.

     


    Enrique Martínez
      [MS MVP - VB]

    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, activa la instrucción Option Strict.

    Donnerstag, 15. Dezember 2011 20:43
  • Me gusta la opción. Ahora he creado una columna para que muestre los distintos estados mediante un icono.

            Dim iconColumn As New DataGridViewImageColumn()
            With iconColumn
                .Image = ImageList.Images("Normal")
                .Name = "Image"
                .HeaderText = ""
                .Width = 20
            End With
            DataGridView.Columns.Insert(0, iconColumn)

    Pero en que evento detecto que el Datatable ha cambiado el RowState de valor?

    Freitag, 16. Dezember 2011 12:43
  • "David Lopez Sierra" preguntó:

    > en que evento detecto que el Datatable ha cambiado el RowState de valor?

    En el evento RowChanged del objeto DataTable, el cual se desencadena cuando se ha modificado correctamente un objeto DataRow existente.

    Obviamente, tendrás que instalar el controlador para el evento RowChanged del objeto DataTable, bien declarado a nivel del formulario un objeto DataTable con eventos:

       Private WithEvent objetoDataTable As DataTable

       Private Sub objetoDataTable_RowChanged(sender As Object, _
            e As DataRowChangeEventArgs) Handles objetoDataTable.RowChanged

       End Sub

    Bien instalando el controlador de evento de la siguiente manera:

       AddHandler objetoDataTable.RowChanged, AddressOf DataTableOnRowChanged

       Private Sub DataTableOnRowChanged(sender As Object, e As DataRowChangeEventArgs)

       End Sub

    En el procedimiento de evento es donde tienes que ejecutar el código fuente que necesites.

     


    Enrique Martínez
      [MS MVP - VB]

    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, activa la instrucción Option Strict.

    Freitag, 16. Dezember 2011 16:31