lunes, 17 de mayo de 2010

SPGridView con generic list

Yo soy de esas personas que me gusta trabajar con objetos POCO, me gusta la frase que decía Einstein: "Se debe hacer todo tan sencillo como sea posible, pero no más sencillo", no me gustan las estructuras de datos como pueden ser los datatable y otros objetos del estilo.

Parece que trabajar con SharePoint y no usar tipos de datos como datatables es algo imposible, pero no es así, y este post es una pequeña explicación de como usar listas genéricas (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx) como datasource de un SPGridView y no perder funcionalidades tales como Paging, Filtering, Sorting, etc.

Para ello hacemos uso de LinqDataSource que de una manera muy simple nos permite asignar una lista genérica al datasource y un único método para obtener los datos (a partir del evento Selecting). Esto implica tener habilitadas las extensiones del framework 3.5 en nuestro entorno SharePoint, para ello podemos utilizar la solución de codeplex: http://features.codeplex.com/

Para ello imaginemos que partimos de la siguiente classe Foo:


public class Foo
{
public String Field1 { get; set; }
public String Field2 { get; set; }

public Foo()
{
}

public Foo(String Field1, String Field2)
{
this.Field1 = Field1;
this.Field2 = Field2;
}
}


Para el ejemplo hemos hecho una simple webpart, que renderiza una SPGridView, donde le hemos asignado como datasource un LinqDataSource que contiene nuestra lista genérica de objetos Foo.

Para ello simplemente hemos sobreescrito el método CreateChildControls, en el creamos nuestro SPGridView y le asignamos propiedades como filtering, sorting, paging, etc. y creamos nuestro datasource, añadimos tanto el datasource, como el SPGridView a la coleción de controles de la webpart y hacemos un bind entre la grid y el datasource. Además de esto creamos un event handler para el evento Selecting del DataSource, este evento permitirá obtener los datos.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Web.UI.WebControls.WebParts;

namespace MyWebparts
{
public class FooWebpart: System.Web.UI.WebControls.WebParts.WebPart
{
#region Variables
///
/// The grid
///

private SPGridView myGrid;

///
/// The datasource
///

private LinqDataSource lqDataSource;

#endregion

public FooWebpart()
{
this.ExportMode = WebPartExportMode.All;
}

protected override void CreateChildControls()
{

// Set basic gridview properties
myGrid = new SPGridView();
myGrid.ID = "MyGrid";
myGrid.AutoGenerateColumns = false;

// Set properties for sorting
myGrid.AllowSorting = true;

// Set properties for paging
myGrid.AllowPaging = true;
myGrid.PageSize = 25;
myGrid.PagerSettings.Mode = PagerButtons.NumericFirstLast;

// Set properties for filtering
myGrid.AllowFiltering = true;
myGrid.FilterDataFields = "Field1, Field2";
myGrid.FilteredDataSourcePropertyName = "Where";
myGrid.FilteredDataSourcePropertyFormat = "{1} == \"{0}\"";

// Set columns of the SPGridView
SPBoundField bfield1 = new SPBoundField();
bfield1.DataField = "Field1";
bfield1.HeaderText = "Field1";
bfield1.SortExpression = "Field1";
myGrid.Columns.Add(bfield1);

SPBoundField bfield2 = new SPBoundField();
bfield2.DataField = "Field2";
bfield2.HeaderText = "Field2";
bfield2.SortExpression = "Field2";
myGrid.Columns.Add(bfield2);

// Create the linqDatasource
lqDataSource = new LinqDataSource();
lqDataSource.ID = "MyLinqDS";
lqDataSource.Selecting += new EventHandler(lqDataSource_Selecting);

// Add datasource to controls collection
Controls.Add(lqDataSource);

// Bind SPGridView to linqdatasource
myGrid.DataSourceID = lqDataSource.ID;
Controls.Add(myGrid);

myGrid.PagerTemplate = null;

base.CreateChildControls();
}

void lqDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
List myGenericList = new List();
myGenericList.Add(new Foo("uno", "uno"));
myGenericList.Add(new Foo("dos", "dos"));

e.Result = myGenericList;
}

}
}

No hay comentarios: