jueves, 23 de septiembre de 2010

Controles enlazados a datos, lidiando con el CRUD automático

Hay algunos controles enlazados a datos que son muy buenos, pero lo que a priori sería algo bueno después se convierte en un obstáculo a vencer. Estoy hablando de las inserciones, actualizaciones y eliminaciones automáticas.

Esto quiere decir que controles como DetailsView, FormView o ListView, esperan que sus respectivos controles de origen de datos tengan comandos de inserción, actualización o eliminación. En caso de no ser así tendremos un bonito error que indica que sin estos comandos no pueden brindarnos esta funcionalidad automática de manipulación del registro activo.

Por ejemplo, en el caso de querer actualizar un registro en un ListView y asumiendo que no queremos actualización automática y por ende nuestro control de origen de datos no tiene un UpdateCommand, obtenemos el siguiente error:

clip_image002

Querer utilizar estos controles (DetailsView, FormView o ListView) y no querer inserciones, actualizaciones y eliminaciones automáticas es un problema pero no es imposible. Para solucionarlo lo que tenemos que hacer es:

  • Interceptar el evento previo (acabado en –ing) adecuado a la operación solicitada
  • Llevar a cabo nuestra lógica de manipulación propia
  •  Cancelar el evento para que el evento asociado posterior (acababo en –ed) no salte
  • Dejar el control en la misma situación que lo hubiera dejado el evento posterior (acabado en –ed) para que ni el usuario ni ASP.NET (nuestro querido amigo) se quejen de nada y no noten el cambiazo sutil que hemos dato.

Para implementar nuestra propia lógica de actualización en un control DetailsView:

    Protected Sub DetailsView1_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewUpdateEventArgs) Handles DetailsView1.ItemUpdating

        Dim cnn As New System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings.Item("WebSiteJBellidoConnectionString").ConnectionString)

        cnn.Open()

        Dim sql As String = _

            "UPDATE Municipios SET Municipio = 'MODIFICADO' WHERE CodigoMunicipio = '" & e.Keys.Item("CodigoMunicipio") & "'"

        Dim cmd As New System.Data.SqlClient.SqlCommand(sql, cnn)

        cmd.ExecuteNonQuery()

        cmd.Dispose()

        cnn.Close()

        e.Cancel = True

        DetailsView1.ChangeMode(DetailsViewMode.ReadOnly)

        DetailsView1.DataBind()

    End Sub

Para implementar nuestra propia lógica de actualización en un control FormView:

    Protected Sub FormView1_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.FormViewUpdateEventArgs) Handles FormView1.ItemUpdating

        Dim cnn As New System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings.Item("WebSiteJBellidoConnectionString").ConnectionString)

        cnn.Open()

        Dim sql As String = _

            "UPDATE Municipios SET Municipio = 'MODIFICADO' WHERE CodigoMunicipio = '" & e.Keys.Item("CodigoMunicipio") & "'"

        Dim cmd As New System.Data.SqlClient.SqlCommand(sql, cnn)

        cmd.ExecuteNonQuery()

        cmd.Dispose()

        cnn.Close()

        e.Cancel = True

        FormView1.ChangeMode(FormViewMode.ReadOnly)

        FormView1.DataBind()

    End Sub

Para implementar nuestra propia lógica de actualización en un control ListView:

    Protected Sub ListView1_ItemUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewUpdateEventArgs) Handles ListView1.ItemUpdating

        Dim cnn As New System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings.Item("WebSiteJBellidoConnectionString").ConnectionString)

        cnn.Open()

        Dim sql As String = _

            "UPDATE Municipios SET Municipio = 'MODIFICADO' WHERE CodigoMunicipio = '" & e.Keys.Item("CodigoMunicipio") & "'"

        Dim cmd As New System.Data.SqlClient.SqlCommand(sql, cnn)

        cmd.ExecuteNonQuery()

        cmd.Dispose()

        cnn.Close()

        e.Cancel = True

        ListView1.EditIndex = -1

        ListView1.DataBind()

    End Sub

Un saludo!

No hay comentarios:

Publicar un comentario