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:
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);
    }
}
e va richiamato con
public class SgartUniqueEventReceiver : SPItemEventReceiver
{
    public override void ItemAdding(SPItemEventProperties properties)
    {
        SgartCheckIfIsUnique(properties, false);
    }

    public override void ItemUpdating(SPItemEventProperties properties)
    {
        SgartCheckIfIsUnique(properties, true);
    }
}
ovviamente la classe SgartUniqueEventReceiver va associata alla lista.

Questo è un esempio di classe per associare un evento ad una lista:
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;
    }
}
che può essere richiamato, ad esempio, sull'attivazione di una feature in questo modo:
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);
     }
}
per gestire sia l'evento di inserimento (ItemAdding) che quello di modifica (ItemUpdating).