lunes, 2 de febrero de 2009

Más allá del Hola Mundo

Vamos a ver si conseguimos ampliar la documentación acerca de como crear un WebPart que no sea el típico “Hola Mundo”. En el mundo real nos vamos encontrar con multitud de situaciones en las que los ejemplos se quedan cortos.

Continuando con la temática de introducción veremos como crear un WebPart de forma “sencilla” sin utilizar el Response.write.

Crearemos un WebPart que nos permita buscar sobre una lista basada en el contentype comentado en el anterior post “Implementación de Contentypes”.

Podéis descargaros el ejemplo completo en: http://blogs.renacimiento.com/mcortes/Documentos/WPVistaEmpleado.zip

 

Empezaremos creando un proyecto del tipo WebPart con las extensiones “VseWSS”.

Para mostrar la parte de interfaz en lugar de utilizar el Response.write cargaremos en tiempo de ejecución un control de usuario mediante el uso de “LoadControl”. Con el control de usuario podremos diseñar nuestra interfaz de forma sencilla con una vista típica de un fichero ascx.

Cargaremos el control desde la función “CreateChildControls” del Webpaprt. En la función LoadControl tendremos que indicarle la ruta donde del fichero ascx, utilizaremos el directorio “CONTROLTEMPLATES” de sharepoint para alojar nuestro fichero. En este directorio podremos almacenar controles de usuario ascx sin tener que registrarlos como “safemode” en el webconfig. Además podremos acceder desde la ruta virtual "_controltemplates”.

 

public class WebPart1 : System.Web.UI.WebControls.WebParts.WebPart
    {
        public WebPart1()
        {
        }

        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            string urlUserControl = @"/_controltemplates/UCVistaEmpleado.ascx";
            Control userControl = this.Page.LoadControl(urlUserControl);
            userControl.ID = "UCVistaEmpleado";

            this.Controls.Add(userControl);
        }
    }

 

Añadiremos entonces a nuestro proyecto un elemento del tipo “Template” y sobre el crearemos la subcarpeta “CONTROLTEMPLATES” y agregaremos un fichero con la extensión ascx y escribiremos la interfaz que deseemos. Para darle funcionalidad a este control tendremos que indicarle al fichero ascx la clase codebehind que la manejará.

Añadiremos una clase que herede de “UserControl” e indicaremos esta clase en el atributo “Inherits” de la directiva “Page”.

Para poder utilizar controles o elementos de sharepoint también registraremos la dll Microsoft.SharePoint y aquellas que necesitemos.

 

<%@ Control Language="C#" Inherits="WPVistaEmpleado.UCVistaEmpleado, WPVistaEmpleado, Version=1.0.0.0,Culture=neutral,PublicKeyToken=37ea3d63d16eb294" compilationMode="Auto" %>
<%@ Register Tagprefix="wssawc" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

 

Para conocer el publicKeytoken sin tener que desplegar el webpart utilizaremos la opción “Package” y consultaremos el publicKeytoken generado en el fichero webpart en el directorio bin.

Ahora agregaremos un SPGridView para mostrar los empleados disponibles y una serie de controles de filtro.

Para manejar los controles desde la clase manejadora definiremos las variables necesarias y las inicializaremos en el evento OnInit.

 

protected SPGridView ListaDeEmpleados;
protected TextBox txtNumeroEmpleado;
protected Button btnBuscar;

protected override void OnInit(EventArgs e)
{
            base.OnInit(e);

            txtNumeroEmpleado = (TextBox)this.TemplateControl.FindControl("txtNumeroEmpleado");
            btnBuscar = (Button)this.TemplateControl.FindControl("btnBuscar");
            btnBuscar.Click += new EventHandler(btnBuscar_Click);
            ListaDeEmpleados = (SPGridView)this.TemplateControl.FindControl("ListaDeEmpleados");
}

 

Fijaros que para capturar los eventos los hemos registrado por código ya que el LoadControl no lo hará por nosotros. Si queremos ahorrarnos este proceso podremos plantearnos introducir nuestro control en un UpdatePanel de Ajax de manera que sea éste el que enganche los eventos definidos en el ascx con nuestra clase.

 

Una vez hemos terminado nuestro control, solo tenemos que desplegarlo y agregarlo en nuestra página de contenidos.

 

Podéis descargaros el ejemplo completo en: http://blogs.renacimiento.com/mcortes/Documentos/WPVistaEmpleado.zip

No hay comentarios: