Pasión por la tecnología…

septiembre 1, 2011

SharePoint 2010: Uso de WebParts por defecto programáticamente (I)!

Archivado en: SharePoint 2010,SharePoint Foundation 2010 — Juan Carlos González Martín @ 16:10

Como veíamos en este artículo, cuando desarrollamos WebParts para SharePoint tenemos la posibilidad de utilizar WebParts por defecto de la plataforma como objetos dentro de las mismas, lo que abre la posibilidad de configurarlos de forma programática de acuerdo a las necesidades planteadas. En este artículo vamos a ver como podemos utilizar una WebPart de tipo XsltListViewWebPart en una WebPart de tipo visual:

  • Lo primero que haremos es crear en Visual Studio 2010 un proyecto de tipo “Empty SharePoint Project”.
  • A continuación añadimos una WebPart de tipo visual al proyecto usando el explorador de soluciones. Nuestra WebPart se compone en su parte “visual” de un control de tipo Label y de un control de tipo “DropDownList”. En este control mostraremos el listado de vistas disponibles para una cierta vista del sitio que posteriormente usaremos para configurar dinámicamente la XsltListViewWebPart a añadir.

image

  • El markup de la WebPart visual es tan sencillo como sigue:
   1: <asp:Label ID="lblVistas" runat="server" Text="Vistas Disponibles" 

   2:     Font-Bold="True"></asp:Label>&nbsp;&nbsp

   3: <asp:DropDownList ID="ddAvailableViews" runat="server" 

   4:     onselectedindexchanged="ddAvailableViews_SelectedIndexChanged">   

   5: </asp:DropDownList><br /><br /> 

  • Nos vamos al code behind del control de usuario que representa la parte visual de la WebPart y comenzamos añadiendo las siguientes directivas using:
   1: //Espacios de nombres necesarios

   2: using SPWebPartPages = Microsoft.SharePoint.WebPartPages;

   3: using Microsoft.SharePoint;

   4: using System.Data;

  • Codificamos el método Page_Load() como se muestra en el listado siguiente. Como veis, en primer lugar estamos configurando el control de tipo DropDownList para añadir las vistas de la lista Tasks del sitio de trabajo. Y a continuación configuramos un objeto de tipo XsltListViewWebPart, previamente declarado como miembro público de la clase, de manera que la vista que muestre sea la que tiene por defecto la lista Tasks.
   1: protected void Page_Load(object sender, EventArgs e)

   2: {            

   3:     if (!Page.IsPostBack)

   4:     {              

   5:         

   6:         //****************************************************************

   7:         //Configuración del combo

   8:         //****************************************************************

   9:         ddAvailableViews.AutoPostBack = true;

  10:         SPWeb spwWeb = SPContext.Current.Web;

  11:         DataTable dtDatosVistas = new DataTable();

  12:         dtDatosVistas.Columns.Add("ViewName");

  13:         dtDatosVistas.Columns.Add("ViewID");

  14:  

  15:         //Datos para completar el combo

  16:         SPList splLista = spwWeb.Lists["Tasks"];

  17:         SPViewCollection spvCollection = splLista.Views;

  18:  

  19:         foreach (SPView v in spvCollection)

  20:         {

  21:             DataRow dtrVista = dtDatosVistas.NewRow();

  22:             if (v.Title == "")

  23:                 dtrVista["ViewName"] = "Vista sin nombre";

  24:             else

  25:                 dtrVista["ViewName"] = v.Title;                  

  26:           

  27:             dtrVista["ViewID"] = v.ID;

  28:             dtDatosVistas.Rows.Add(dtrVista);

  29:         }

  30:         ddAvailableViews.DataSource = dtDatosVistas;

  31:         ddAvailableViews.DataValueField = "ViewID";

  32:         ddAvailableViews.DataTextField = "ViewName";

  33:         ddAvailableViews.DataBind();

  34:  

  35:         //****************************************************************

  36:         //Configuración de la XsltListViewWebPart

  37:         //****************************************************************

  38:         lblVistas.Text = "Vistas disponibles para la lista " +

  39:             splLista.Title;

  40:         xsltvwListViewWebPart = new SPWebPartPages.XsltListViewWebPart();

  41:         xsltvwListViewWebPart.ListId = splLista.ID;

  42:         xsltvwListViewWebPart.ViewGuid =

  43:             splLista.DefaultView.ID.ToString();

  44:         xsltvwListViewWebPart.Title = splLista.DefaultView.Title;

  45:         xsltvwListViewWebPart.AllowConnect = true;

  46:         xsltvwListViewWebPart.AllowEdit = true;

  47:         xsltvwListViewWebPart.AllowHide = false;

  48:         xsltvwListViewWebPart.AllowMinimize = false;

  49:  

  50:     }

  51: }

  • Codificamos el manejador del control DropDownList de manera que configuramos el objeto XsltListViewWebPart de acuerdo a la vista seleccionada por el usuario en el control “DropDownList”.
   1: protected void ddAvailableViews_SelectedIndexChanged(object sender, EventArgs e)

   2: {

   3:     xsltvwListViewWebPart = 

   4:         new SPWebPartPages.XsltListViewWebPart();

   5:     SPWeb spwWeb = SPContext.Current.Web;

   6:     SPList splLista = spwWeb.Lists["Tasks"];

   7:     xsltvwListViewWebPart.ListId = splLista.ID;

   8:     xsltvwListViewWebPart.ViewGuid = 

   9:         ddAvailableViews.SelectedItem.Value;

  10:     xsltvwListViewWebPart.Title = ddAvailableViews.SelectedItem.Text;

  11:     xsltvwListViewWebPart.AllowConnect = true;

  12:     xsltvwListViewWebPart.AllowEdit = true;

  13:     xsltvwListViewWebPart.AllowHide = false;

  14:     xsltvwListViewWebPart.AllowMinimize = false;           

  15: }

  • Añadimos una sobreescritura del método OnPreRender() que nos permite añadir el objeto XsltListViewWebPart como control a la WebPart cuando se hagan postbacks al servidor. Por ejemplo, cada vez que seleccionemos un vista del control DrownDownList. En cambio, este control no será añadido la primera vez que se visualice la WebPart…esto lo haremos en la clase que se encarga de añadir el control de usuario como control de la WebPart que se muestra al usuario.
   1: protected override void OnPreRender(EventArgs e)

   2: {

   3:     if (Page.IsPostBack)

   4:     {

   5:         Controls.Add(xsltvwListViewWebPart);

   6:     }            

   7: }

  • A través del explorador de soluciones editamos el archivo de código en el que está codificada la clase que representa la WebPart que realmente se muestra al usuario.

image

  • Añadimos una directiva using a Microsoft.SharePoint.WebPartPages y un objeto de tipo XsltListViewWebPart a nivel de clase.
  • Codificamos el evento CreateChildControls() de la WebPart de la siguiente forma:
   1: protected override void CreateChildControls()

   2: {

   3:     Control control = Page.LoadControl(_ascxPath);

   4:     Controls.Add(control);            

   5:     

   6:     xsltvwListViewWebPartToAdd =

   7:         ((SPOOBWebPartUserControl)control).xsltvwListViewWebPart;

   8:  

   9:     if (xsltvwListViewWebPartToAdd != null)

  10:     {

  11:         this.Controls.Add(

  12:             (xsltvwListViewWebPartToAdd));              

  13:     }            

  14: }

  • Como se deduce, únicamente estamos inicializando el objeto XsltListViewWebPart de la clase con su “igual” del control de usuario de la WebPart…lo que sucede únicamente la primera vez que se visualiza la WebPart y no se ha hecho un PostBack al servidor, de ahí la comprobación que se realiza a continuación y que nos permite añadir el objeto como control a la WebPart únicamente cuando se ha inicializado correctamente.
  • Compilamos el proyecto y desplegamos la WebPart.
  • En el sitio de trabajo creamos una página de WebParts en la que añadimos la WebPart y comprobamos que tanto el DropDownList como la XsltListViewWebPart muestran correctamente los valores inicialmente especificados.
  • Si seleccionamos una vista diferente, la XsltListViewWebPart dinámicamente cambia la vista mostrada.
image image

Para finalizar, os dejo un enlace por cortesía de mi compañero Ángel Acha en el que se muestra “el camino contrario” a la hora de configurar propiedades definidas en la WebPart en el control de usuario…pero este será tema de otro post: http://www.lamber.info/post/2010/05/21/How-do-I-create-custom-properties-in-Visual-Web-Parts.aspx.

El tema Rubric Blog de WordPress.com.

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 39 seguidores