[WebForms] Todavía no usas el ObjectDataSource?

Este es el intento N, de enviar un post de introducción al ObjectDataSource. Muchos post extensos se han quedado en el draft, veremos si este ve la luz.

ASP.NET disponible de varios controles para mostrar datos: GridView, ListView, DataList, Repeater, el mismo FormView. En cuanto controles para el artículo vamos a usar el GridView y el FormView. Veamos algunos ejemplos y al final intentamos definir al ObjectDataSource.

 

Mostrando datos

La forma tradicional, es el clásico:

   1: //enlazar gridView

   2: grdCategories.DataSource = blCatManager.GetAll();

   3: grdCategories.DataBind(); 

Con el ObjectDataSource no hago nada y todo es declarativo:

   1: <asp:GridView ID="grdCategories" runat="server" 

   2:        AutoGenerateColumns="False" 

   3:     DataKeyNames="CategoryID" DataSourceID="odsCategorias">

   4:     <Columns> <!-- Aqui Columnas --> </Columns>

   5:   </asp:GridView>

   6: <asp:ObjectDataSource ID="odsCategorias" runat="server" 

   7:     OldValuesParameterFormatString="original_{0}" SelectMethod="getAll" 

   8:     TypeName="CategoryManager">

   9: </asp:ObjectDataSource>

Este código no hay que aprenderlo de memoria, lo puede generar el asistente. Para grandes cantidades de información debemos usar paginación personalizada, el control GridView + ObjectDataSource, soportan esto de manera transparente, sólo hay que agregar un método count y mapearlo. Revisar más detalles en el siguiente artículo: Paginando Eficientemente en ASP.NET.

 

Ingreso de datos

Creo que este es el fuerte de los ObjectDataSource y una de las cosas por la cual lo uso en todos los proyectos de ASP.NET en que participo. Cuando he tenido la oportunidad de integrar nuevos equipos de desarrollo o visitar a algunos, muchos todavía siguen con el clásico recuperar/asignar el contenido de las cajas de texto de uno a uno, muchas veces por el desconocimiento de la existencia del control ObjectDataSource. Después de unas demos con el ObjectDataSource, también terminan adoptándolo, salvo algunos casos en que resisten al cambio, y trabajar con mas orden o porque tienen el famoso código: “mírame y no me toques”. si ese código donde si cambias un C= A + B, a C = B + A, la aplicación completa deja de funcionar.

Si quiere cargar el detalle de un registro en un formulario que tengo que hacer:

   1: //asignar información de objetos a las cajas de texto

   2: CategoryNameTextBox.Text = objItem.CategoryName; 

Y por el contrario si quiero recuperar el objeto para guardarlo en la base de datos, lo primero que debo hacer es recuperarlo de la caja de texto:

   1: //recuperar la información de las cajas de texto, para guardarlas en un objeto

   2: objItem.CategoryName = CategoryNameTextBox.Text; 

Un control FormView + ObjectDataSource, hace esto por ti, y todo de manera declarativa:

   1: <asp:FormView ID="frvDetCategoria" runat="server" 

   2:      DataKeyNames="CategoryID" 

   3:      DataSourceID="odsCatDetails">

   4:      <EditItemTemplate>

   5:        CategoryID:

   6:        <asp:Label ID="CategoryIDLabel1" runat="server" 

   7:          Text='<%# Eval("CategoryID") %>' />

   8:        <br />

   9:        CategoryName:

  10:        <asp:TextBox ID="CategoryNameTextBox" runat="server" 

  11:          Text='<%# Bind("CategoryName") %>' />

  12:        <br />

  13:        CategoryDescription:

  14:        <asp:TextBox ID="CategoryDescriptionTextBox" runat="server" 

  15:          Text='<%# Bind("CategoryDescription") %>' />

  16:        <br />

  17:        <asp:LinkButton ID="UpdateButton" runat="server" 

  18:           CausesValidation="True" 

  19:          CommandName="Update" Text="Actualizar" />

  20:        &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server" 

  21:          CausesValidation="False" 

  22:           CommandName="Cancel" Text="Cancelar" />

  23:      </EditItemTemplate>

  24:      <InsertItemTemplate><!-- El formulario insert puede 

  25:             ser distinto por ya no se 

  26:              actualiza los campos claves --></InsertItemTemplate>

  27:      <ItemTemplate><!-- Informacion solo lectura --></ItemTemplate>

  28:    </asp:FormView>

  29:    <asp:ObjectDataSource ID="odsCatDetails" runat="server" 

  30:      DataObjectTypeName="Category" DeleteMethod="Delete" 

  31:      InsertMethod="Insert" 

  32:      OldValuesParameterFormatString="original_{0}" 

  33:      SelectMethod="getOneByID" 

  34:      TypeName="CategoryManager" UpdateMethod="Update">

  35:      <SelectParameters>

  36:        <asp:ControlParameter ControlID="grdCategories" 

  37:           Name="categoryID" 

  38:          PropertyName="SelectedValue" Type="Int32" />

  39:      </SelectParameters>

  40:    </asp:ObjectDataSource>

Con el control FormView se puede hacer prácticamente todo tipo de mantenimiento, se puede poner combos dentro de el y además que esté enlazados a base de datos a través de otro control ObjectDataSource. Podemos decir que el ObjectDataSource es un motorcito que permite mapear automáticamente controles de datos (tanto para mostrar como para recuperar) con clases y objetos. Imaginen un formulario de 20 campos y tener que asignar/recuperar uno por uno. Con el ObjectDataSource no es nada.

Para terminar, si están desarrollando en ASP.NET con WebForms, los animo a intentar usar el FormView + ObjectDataSource en los escenarios de mantenimiento que tengan, y si tienen alguna duda, puede dejar sus comentarios y vemos como los ayudamos. En base a las preguntas que tengan, podemos hacer ejemplos más elaborados y más puntuales.

Pueden descargar la aplicación ejemplo aquí: CRUD usando ObjectDataSource. (completar los acceso a datos del Insert, Update, Delete).

Página en el navegador:

El código que tiene la página aspx es:

   1: //pagina ASPX

   2: using System;

   3:  

   4: public partial class wfCategories : System.Web.UI.Page

   5: {

   6:     protected void Page_Load(object sender, EventArgs e)

   7:     {

   8:  

   9:     }

  10: }

La clase que use para el ObjectDataSource es la siguiente:

   1: //CategoryManager

   2: using System;

   3: using System.Collections.Generic;

   4: using System.ComponentModel;

   5:  

   6: [DataObject]

   7: public class CategoryManager

   8: {

   9:  

  10:   #region GetAll, getOne

  11:  

  12:   [DataObjectMethod(DataObjectMethodType.Select, true)]

  13:   public List<Category> getAll()

  14:   {

  15:     CategoryRepository catRep = new CategoryRepository();

  16:  

  17:     return catRep.getAll();

  18:   }

  19:  

  20:   [DataObjectMethod(DataObjectMethodType.Select, false)]

  21:   public Category getOneByID(Int32 categoryID)

  22:   {

  23:     CategoryRepository catRep = new CategoryRepository();

  24:     return catRep.getOneByID(categoryID);

  25:   }

  26:  

  27:   #endregion

  28:  

  29:   #region Insert, Update, Delete

  30:  

  31:   [DataObjectMethod(DataObjectMethodType.Insert,true)]

  32:   public void Insert(Category objItem)

  33:   {

  34:     //pendiente de implementacion

  35:   }

  36:  

  37:   [DataObjectMethod(DataObjectMethodType.Update, true)]

  38:   public void Update(Category objItem)

  39:   {

  40:     //pendiente de implementacion

  41:   }

  42:  

  43:   [DataObjectMethod(DataObjectMethodType.Delete, true)]

  44:   public void Delete(Category objItem)

  45:   {

  46:     //pendiente de implementacion

  47:   }

  48:  

  49:   #endregion

  50:  

  51: }

Saludos,

7 comentarios en “[WebForms] Todavía no usas el ObjectDataSource?”

  1. Chevere el articulo, habia leido sobre el ObjectDataSource antes y espero poder aplicarlo en varias de las páginas aspx que estoy implementando.

    Estuvo estupendo el articulo de “Paginando eficientemente en ASP.NET” 😀

    Saludos desde Lima! 😀

  2. Buenas,
    Es muy bueno eso del object data source. Yo ultimamente lo uso, pero mis managers devuelven un datatable o dataset en vez de una lista de objetos.
    Que beneficios hay en usar una lista de objetos en lugar de usar directamente el dataset o datatable ?
    Tampoco entendi muy bien que significa el parametro OldValuesParameterFormatString, yo no lo uso.

  3. Creo que usar el formview es algo que no ahorra codigo. Por ejemplo, tengo un formulario con 10 campos. Estos 10 controles(textbox, combos, etc), se tienen que repetir en cada template del formview (itemtemplate, edititemtemplate). Creo que esto quita mas libertad o personalizacion al desarrollo, porque si queres, nose, personalizar un control, tenemos que recuperar y castear el control (ejemplo: dropdownlist) del formview y hacer lo que queremos. En cuanto a velocidad del desarrollo creo que es mas rapido, pero usando alguno generador de codigo, creo que sería una mejor herramienta.

  4. Hola,
    Tengo una pregunta… ¿como puedo reiniciar la paginacion, es decir para que vuelva el gridview a la primera pagina?
    Lo pregunto proque tengo uans opciones para realizar filtro, pero si por ejemplo estoy ubicado en la pagina 3 y realizo unfiltro que retorna menos datos, mustra la pagina 3 sin datos. Adicionalmente sigue mostrando el total de paginas de la cosulta incial.

    por favor ayuda.
    Gracias.

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *