none
Cómo eliminar registros eliminados en un DataGridView enlazado en la BD trabajando por capas RRS feed

  • Pregunta

  • Estimados todos, esperando se encuentren muy bien, vengo a hacerles una consulta y espero puedan ayudarme, ya que he estado batallando un buen rato con esto a lo cual no le he encontrado solución. 

    Estoy haciendo una pequeña aplicación separada en tres capas, para organizar mi código y separar la funcionalidad de la misma. He de confesar que anteriormente he escrito código de manera muy desorganizada, haciendo complicado el mantenimiento de mis aplicaciones y he decidido trabajar de esta nueva forma que me ha gustado mucho.

    Verán, he creado una librería de clases, en donde agregaré las clases por cada entidad que necesite en la aplicación.

    Como pueden observar en la imagen, tengo dos proyectos, "Neptuno" que es el proyecto principal y "NeptunoLibrary" la librería de clases) la cual ya tengo referenciada en "Neptuno". Dentro de "NeptunoLibrary" tengo la clase "Empleados" y un DataSet tipado en donde tengo a "EmpleadosDataTable" y "EmpleadosTableAdapter"

    En mi proyecto "Neptuno" tengo mi formulario "frmEmpleados" el cual lo único que hace es Cargar la lista de empleados, eliminar un empleado (registro) del DataGridView y actualizar las modificaciones en la BD. 

    El problema está en que al intentar actualizar los cambios en la BD, estos cambios no se reflejan, ya que al volver a cargar la lista de Empleados, siguen apareciendo los registros que she eliminado del DataGridView enlazado a "EmpleadosDataTable"

    Este es el código del "frmEmpleados" 

    Imports NeptunoLibrary Imports NeptunoLibrary.dSetNeptuno Public Class frmEmpleados Private objEmpleado As New Empleados Private objDsetNeptuno As dSetNeptuno Private objDataTableEmpleados As EmpleadosDataTable Private Sub btnCargar_Click(sender As Object, e As EventArgs) Handles btnCargar.Click Try 'CargarEmpleados() devuelve un DataSet con la lista de Empleados Me.objDsetNeptuno = Me.objEmpleado.CargarEmpleados() Me.dgvEmpleados.DataSource = Me.objDsetNeptuno.Tables("Empleados") Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub

    Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles btnEliminar.Click Try 'Remueve del DataTable el registro eliminado del DataGridView Me.objDsetNeptuno.Tables("Empleados").Rows.RemoveAt(Me.dgvEmpleados.CurrentRow.Index) Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub

    Private Sub btnActualizar_Click(sender As Object, e As EventArgs) Handles btnActualizar.Click Try 'Envía como argumento el objDsetNeptuno con los registros borrados de la Tabla Empleados objEmpleado.ActualizarCambios(objDsetNeptuno) Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub

    End Class

    Como podrán darse cuenta, al presionar el botón "btnActualizar", estoy mandando todo el DataSet alobjEmpleado.ActualizarCambios(objDsetNeptuno) de la clase "Empleados". El método ActualizarCambios() ejecuta el método Fill() de "EmpleadosTableAdapter" para actualizar los cambios en la BD, pero simplemente no lo hace :(

    Este es el código de la clase "Empleados"

    Imports NeptunoLibrary.dSetNeptunoTableAdapters Imports NeptunoLibrary Imports NeptunoLibrary.dSetNeptuno Public Class Empleados Private objEmpleadosTableAdapter As New EmpleadosTableAdapter Private objDsetNeptuno As New dSetNeptuno Private objDataTableEmpleados As EmpleadosDataTable 'Este método CargarEmpleados() utiliza el método Fill() del objeto 'objEmpleadosTableAdapter para llenar la tabla Empleados del objDsetNeptuno 'y retorna el objDsetNeptuno para ser cargado en el DataGridView Public Function CargarEmpleados() As dSetNeptuno Try Me.objEmpleadosTableAdapter.Fill(Me.objDsetNeptuno.Tables("Empleados")) Return Me.objDsetNeptuno Catch ex As Exception Throw ex End Try End Function 'Este método ActualizarCambios() recibe como parámetro el DataSetNeptuno 'enviado desde el frmEmpleados para actualizar los cambios en la BD Public Sub ActualizarCambios(DataSetNeptuno As dSetNeptuno) Try ''Me.objDsetNeptuno = DataSetNeptuno Me.objEmpleadosTableAdapter.Update(DataSetNeptuno.Tables("Empleados")) Catch ex As Exception Throw ex End Try End Sub

    End Class

    ¿Hay algo que he estado haciendo mal? Alguien por favor que me oriente o que me diga cuál es mi error porque no he podido encontrar la solución.

    jueves, 26 de noviembre de 2015 6:00

Respuestas

  • "Alberto Lázaro" escribió:

    > El problema está en que al intentar actualizar los cambios en la BD, estos
    > cambios no se reflejan, ya que al volver a cargar la lista de Empleados,
    > siguen apareciendo los registros que he eliminado del DataGridView enlazado
    > a "EmpleadosDataTable"
    >
    > ¿Hay algo que he estado haciendo mal? Alguien por favor que me oriente o
    > que me diga cuál es mi error porque no he podido encontrar la solución.

    Hola, Alberto:

    El problema radica en el código que estás ejecutando cuando haces clic en el botón Eliminar:

        Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles btnEliminar.Click
            Try
                'Remueve del DataTable el registro eliminado del DataGridView
                Me.objDsetNeptuno.Tables("Empleados").Rows.RemoveAt(Me.dgvEmpleados.CurrentRow.Index)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

    Como podrás observar, estás utilizando el método RemoveAt para eliminar un fila (objeto DataRow) del objeto DataTable enlazado con el control DataGridView, y deberías de saber que dicho método efectúa una llamada al método AcceptChanges de su objeto DataTable para confirmar todos los cambios realizados en él, por tanto, cuando tu deseas actualizar el origen de datos pasándole el objeto DataSet

         objEmpleado.ActualizarCambios(objDsetNeptuno)

    no se actualiza ningún dato ya que NO EXISTEN MODIFICACIONES PENDIENTES DE REALIZAR. ¡Así de sencillo! ;-)

    Si tienes enlazado el control DataGridView con un objeto DataTable, todas las modificaciones (eliminar, actualizar, insertar nuevas filas) las tienes que realizar en el propio objeto DataGridView para que éstos cambios surtan efecto en el objeto DataTable subyacente, por lo que de nada sirve el código existente en el procedimiento btnEliminar_Click, salvo que en el mismo elimines la fila actualmente seleccionada en el control DataGridView en lugar de eliminar la fila en el propio objeto DataTable llamando a su método RemoveAt:

        Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles btnEliminar.Click
    
            Try
                ' Referenciamos la fila actual del control DataGridView.
                Dim filaActual As DataGridViewRow = dgvEmpleados.CurrentRow
    
                If (Not filaActual Is Nothing) Then
                    ' Si su valor no es Nothing, la eliminamos.
                    dgvEmpleados.Rows.RemoveAt(filaActual.Index)
                End If
    
                ' Si eliminamos la fila en el objeto DataTable mediante el método
                ' RemoveAt, posteriormente no se podrá actualizar el origen de datos.
                '
                ' Remueve del DataTable el registro eliminado del DataGridView
                ' Me.objDsetNeptuno.Tables("Empleados").Rows.RemoveAt(Me.dgvEmpleados.CurrentRow.Index)
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    O si lo prefieres, podrías referenciar el objeto DataRow correspondiente a la fila actualmente seleccionada en el control DataGridView y llamar a su método Delete:

        Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles btnEliminar.Click
    
            Try
                ' Referenciamos la fila actual del control DataGridView.
                Dim filaActual As DataGridViewRow = dgvEmpleados.CurrentRow
    
                If (Not filaActual Is Nothing) Then
                    ' Si su valor no es Nothing, la eliminamos.
                    Dim row As DataRow = Me.objDsetNeptuno.Tables("Empleados").Rows(filaActual.Index)
                    row.Delete()
                End If
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    En resumidas cuentas. Para actualizar el origen de datos tienen que existir cambios pendientes de actualizar, es decir, el valor de la propiedad HasChanges del objeto DataSet tiene que ser True:

        Dim existenCambiosPendientes As Boolean = objDsetNeptuno.HasChanges

    Si el valor es False, por mucho que llames al método ActualizarCambios no se actualizará el origen de datos, porque no existe nada que actualizar. ;-)

    Un saludo


    Enrique Martínez Montejo
            [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, se inteligente y activa la instrucción
    Option Strict.



    sábado, 28 de noviembre de 2015 12:39
    Moderador

Todas las respuestas

  • Una disculpa porque no puedo cargar imágenes hasta que no se verifique mi cuenta, pero espero puedan analizar mi código y darse una idea de cómo tengo estructurada mi aplicación.
    jueves, 26 de noviembre de 2015 6:02
  • "Alberto Lázaro" escribió:

    > El problema está en que al intentar actualizar los cambios en la BD, estos
    > cambios no se reflejan, ya que al volver a cargar la lista de Empleados,
    > siguen apareciendo los registros que he eliminado del DataGridView enlazado
    > a "EmpleadosDataTable"
    >
    > ¿Hay algo que he estado haciendo mal? Alguien por favor que me oriente o
    > que me diga cuál es mi error porque no he podido encontrar la solución.

    Hola, Alberto:

    El problema radica en el código que estás ejecutando cuando haces clic en el botón Eliminar:

        Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles btnEliminar.Click
            Try
                'Remueve del DataTable el registro eliminado del DataGridView
                Me.objDsetNeptuno.Tables("Empleados").Rows.RemoveAt(Me.dgvEmpleados.CurrentRow.Index)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

    Como podrás observar, estás utilizando el método RemoveAt para eliminar un fila (objeto DataRow) del objeto DataTable enlazado con el control DataGridView, y deberías de saber que dicho método efectúa una llamada al método AcceptChanges de su objeto DataTable para confirmar todos los cambios realizados en él, por tanto, cuando tu deseas actualizar el origen de datos pasándole el objeto DataSet

         objEmpleado.ActualizarCambios(objDsetNeptuno)

    no se actualiza ningún dato ya que NO EXISTEN MODIFICACIONES PENDIENTES DE REALIZAR. ¡Así de sencillo! ;-)

    Si tienes enlazado el control DataGridView con un objeto DataTable, todas las modificaciones (eliminar, actualizar, insertar nuevas filas) las tienes que realizar en el propio objeto DataGridView para que éstos cambios surtan efecto en el objeto DataTable subyacente, por lo que de nada sirve el código existente en el procedimiento btnEliminar_Click, salvo que en el mismo elimines la fila actualmente seleccionada en el control DataGridView en lugar de eliminar la fila en el propio objeto DataTable llamando a su método RemoveAt:

        Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles btnEliminar.Click
    
            Try
                ' Referenciamos la fila actual del control DataGridView.
                Dim filaActual As DataGridViewRow = dgvEmpleados.CurrentRow
    
                If (Not filaActual Is Nothing) Then
                    ' Si su valor no es Nothing, la eliminamos.
                    dgvEmpleados.Rows.RemoveAt(filaActual.Index)
                End If
    
                ' Si eliminamos la fila en el objeto DataTable mediante el método
                ' RemoveAt, posteriormente no se podrá actualizar el origen de datos.
                '
                ' Remueve del DataTable el registro eliminado del DataGridView
                ' Me.objDsetNeptuno.Tables("Empleados").Rows.RemoveAt(Me.dgvEmpleados.CurrentRow.Index)
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    O si lo prefieres, podrías referenciar el objeto DataRow correspondiente a la fila actualmente seleccionada en el control DataGridView y llamar a su método Delete:

        Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles btnEliminar.Click
    
            Try
                ' Referenciamos la fila actual del control DataGridView.
                Dim filaActual As DataGridViewRow = dgvEmpleados.CurrentRow
    
                If (Not filaActual Is Nothing) Then
                    ' Si su valor no es Nothing, la eliminamos.
                    Dim row As DataRow = Me.objDsetNeptuno.Tables("Empleados").Rows(filaActual.Index)
                    row.Delete()
                End If
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    En resumidas cuentas. Para actualizar el origen de datos tienen que existir cambios pendientes de actualizar, es decir, el valor de la propiedad HasChanges del objeto DataSet tiene que ser True:

        Dim existenCambiosPendientes As Boolean = objDsetNeptuno.HasChanges

    Si el valor es False, por mucho que llames al método ActualizarCambios no se actualizará el origen de datos, porque no existe nada que actualizar. ;-)

    Un saludo


    Enrique Martínez Montejo
            [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, se inteligente y activa la instrucción
    Option Strict.



    sábado, 28 de noviembre de 2015 12:39
    Moderador
  • Es usted un genio. Muchísimas gracias, he podido solucionarlo.
    domingo, 29 de noviembre de 2015 4:12