[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: <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,