EventHandler per controllare l'univocità di una serie di campi
Un esempio di Event Handler per SharePoint 2010 che controlla se nella lista sono presenti solo valori univoci.
In questo caso controllo che il campo custom Date1 e il campo di sistema Created By (Autor) siano univoci in tutta la lista. In questo modo mi assicuro di avere per ogni giorno un solo inserimento per persona.
Per far questo sfrutto gli eventi sincroni della lista ItemAdding e ItemUpdating.
Questo è il codice che controlla l'univocità della coppia di campi:
e va richiamato con
ovviamente la classe SgartUniqueEventReceiver va associata alla lista.
Questo è un esempio di classe per associare un evento ad una lista:
che può essere richiamato, ad esempio, sull'attivazione di una feature in questo modo:
per gestire sia l'evento di inserimento (ItemAdding) che quello di modifica (ItemUpdating).
In questo caso controllo che il campo custom Date1 e il campo di sistema Created By (Autor) siano univoci in tutta la lista. In questo modo mi assicuro di avere per ogni giorno un solo inserimento per persona.
Per far questo sfrutto gli eventi sincroni della lista ItemAdding e ItemUpdating.
Questo è il codice che controlla l'univocità della coppia di campi:
C#
private void SgartCheckIfIsUnique(SPItemEventProperties properties, bool isInUpdate)
{
try
{
SPWeb web = properties.Web;
SPList list = web.Lists[properties.ListId];
SPQuery query = new SPQuery();
string sDate = (string)properties.AfterProperties["PresenceDate"];
if (sDate == null)
return;
SPUser user = web.CurrentUser;
query.Query = string.Format(@"<Where>
<And>
<Eq><FieldRef Name='PresenceDate' /><Value Type='DateTime' IncludeTimeValue='FALSE'>{0}</Value></Eq>
<Eq><FieldRef Name='Author' LookupId='true' /><Value Type='User'>{1}</Value></Eq>
</And></Where>"
, SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Parse(sDate))
, user.ID);
query.RowLimit = 2;
SPListItemCollection items = list.GetItems(query);
if (isInUpdate == true)
{
//sono in update
if (items.Count > 1 || (items.Count == 1 && properties.ListItemId != items[0].ID))
{
properties.Cancel = true;
}
}
else
{
//sono in inserimento
if (items.Count > 0)
{
properties.Cancel = true;
}
}
if (properties.Cancel == true)
{
properties.ErrorMessage = "There is already an item with same Author and Date in this list";
}
}
catch (Exception ex)
{
properties.Cancel = true;
properties.ErrorMessage = ex.Message;
System.Diagnostics.EventLog.WriteEntry("Error encountered in SgartCheckIfIsUnique: ", ex.Message);
}
}
C#
public class SgartUniqueEventReceiver : SPItemEventReceiver
{
public override void ItemAdding(SPItemEventProperties properties)
{
SgartCheckIfIsUnique(properties, false);
}
public override void ItemUpdating(SPItemEventProperties properties)
{
SgartCheckIfIsUnique(properties, true);
}
}
Questo è un esempio di classe per associare un evento ad una lista:
C#
public static void SgartAddEventHandlerToList(SPFeatureReceiverProperties properties,string listName, Type classType, SPEventReceiverType eventType)
{
try
{
SPWeb web = (SPWeb)properties.Feature.Parent;
SPList list = web.GetList(web.ServerRelativeUrl.TrimEnd('/') + listName);
//verifico se esiste già
string className = classType.FullName;
string assembly = System.Reflection.Assembly.GetExecutingAssembly().FullName;
//SPEventReceiverType evType = Microsoft.SharePoint.SPEventReceiverType.ItemAdding;
foreach (SPEventReceiverDefinition ev1 in list.EventReceivers)
{
if (ev1.Assembly == assembly && ev1.Class == className && ev1.Type == eventType)
{
ev1.Delete();
break;
}
}
SPEventReceiverDefinition ev = list.EventReceivers.Add();
ev.Assembly = assembly;
ev.Class = className;
ev.Type = eventType;
ev.SequenceNumber = 1000;
ev.Data = "";
ev.Update();
list.Update();
}
catch (Exception ex)
{
System.Diagnostics.EventLog.WriteEntry("Error encountered in SgartAddEventHandlerToList: ", ex.Message);
throw ex;
}
}
C#
public class SgartEsempiotEventReceiver : SPFeatureReceiver
{
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SgarAddEventHandlerToList(properties, "/Lists/ProvaEvento", typeof(SgartUniqueEventReceiver), SPEventReceiverType.ItemAdding);
SgartAddEventHandlerToList(properties, "/Lists/ProvaEvento", typeof(SgartUniqueEventReceiver), SPEventReceiverType.ItemUpdating);
}
}