8/4/08

Eventos en WSS 3.0

Una de las alternativas que tenemos a la creación de un workflow es utilizar eventos. Los eventos nos van a permitir controlar determinados aspectos de nuestros ítems, nuestras listas, e incluso webs.

Los eventos tienen dos formas, la que está en pasado que se llevará a cabo cuando el evento ya se ha producido, y la continua que se llevará a cabo antes de que el evento ocurra. Con todo esto, disponemos de los siguientes eventos:

En esta tabla se recogen las diferentes posibilidades:

SPItemEventReceiver
ItemAdded ItemAdding ItemAttachmentAdded ItemAttachmentAdding
ItemAttachmentDeleted ItemAttachmentDeleting ItemCheckedIn ItemCheckedOut ItemCheckingIn ItemCheckingOut ItemDeleted ItemDeleting ItemFileConverted ItemFileMoving ItemUncheckedOut ItemUncheckingOut ItemUpdated ItemUpdating

SPListEventReceiver
FieldAdded FieldAdding FieldDeleted FieldDeleting FieldUpdated FieldUpdating

SPWebEventReceiver
SiteDeleted SiteDeleting WebDeleted WebDeleting WebMoved WebMoving

Lo primero que tenemos que hacer es crearnos una clase que herede del Receiver que nos interesa:

public class MiEventHandler : SPItemEventReceiver
{ .... }


En este ejemplo queremos que:
1.- cuando se inserte un ítem, en el metadato “Datos” ponga "Nuevo .."
2.- y cuando se modifique ponga "Modificado ..".
3.- y que sólo se pueda eliminar un ítem modificado.

Para ellos sobreescribimos los eventos ItemAdded, ItemUpdated e ItemDeleting

public override void ItemAdded(SPItemEventProperties properties)
{
SPListItem listItem = properties.ListItem;
listItem["Datos"] = "Nuevo " + properties.EventType.ToString();

DisableEventFiring();
listItem.Update();
EnableEventFiring();
}


public override void ItemUpdated(SPItemEventProperties properties)
{
SPListItem listItem = properties.ListItem;
if (listItem["Datos"].ToString().Contains("Nuevo"))
{
listItem["Datos"] = "Modificado " + properties.EventType.ToString(); ;
listItem.Update();
}
}


public override void ItemDeleting(SPItemEventProperties properties)
{
SPListItem listItem = properties.ListItem;
if (listItem["Datos"].ToString().Contains("Nuevo"))
{
properties.Cancel = true;
properties.ErrorMessage = "No se puede eliminar un elemento Nuevo";
}
}


NOTA: Utilizamos ItemDeleting y no Itemdeleted porque no queremos que el ítem se borre, queremos hacer una comprobación previa.

NOTA2: Hay que Habilitar y Deshabilitar los eventos si vemos que pueden entrar en conflicto. Por ejemplo, si en el ITemAdded modificamos un item y hacemos item.Update(); lo que estamos haciendo es lanzar automaticamente ItemUpdating y a lo mejor no nos interesa.


Para agregar la DLL a las listas que queramos nos haremos una aplicación Windows que tendrá este código:

using System;
using Microsoft.SharePoint;

namespace ConsoleTools
{
class Program
{
static void Main(string[] args)
{
SPSite site = new SPSite("SITE");
SPWeb web = site.OpenWeb();
SPList list = web.Lists[LISTA];

string ensamblado = "MiWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxx";
string clase = "MiWebPart.MiEventHandler";

list.EventReceivers.Add(SPEventReceiverType.ItemAdded, ensamblado, clase);
list.EventReceivers.Add(SPEventReceiverType.ItemUpdated, ensamblado, clase);
list.EventReceivers.Add(SPEventReceiverType.ItemDeleting, ensamblado, clase);

}
}
}

Ejecutando este código y después haciendo IISRESET veremos que el comportamiento de nuestra lista ha cambiado.
Código sacado del
Blog de Carlos Segura

saludos,
Juan Alcalá







No hay comentarios: