Real Disable Event Firing :)

Posted: 22.10.2013 in C#, Разработка, SharePoint

В интернетах есть несколько вариантов как к примеру обновить элемент без старта привязанных к нему событий, но они либо не очень работают, либо работают в определённых контекстах. Вот ниже способ, который работает при обращении к элементам даже из консольного приложения.

Это extension-класс для SPListItem. Основа это пост на stackoverflow , я лишь добавил от себя ещё пару функций для работы с файлами — добавление файла и функцию CopyTo, для «тихого» копирования файла.

using Microsoft.SharePoint;

public static class SPListItemExtensions
{
    /// <summary>
    /// Provides ability to update list item without firing event receiver.
    /// </summary>
    /// <param name="item">list item</param>
    /// <param name="doNotFireEvents">Disables firing event receiver while updating item.</param>
    public static void Update(this SPListItem item, bool doNotFireEvents)
    {
        SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
        if (doNotFireEvents)
        {
            try
            {
                rh.DisableEventFiring();
                item.Update();
            }
            finally
            {
                rh.EnableEventFiring();
            }
        }
        else
        {
            item.Update();
        }
    }

    /// <summary>
    /// Provides ability to update list item without firing event receiver.
    /// </summary>
    public static void SystemUpdate(this SPListItem item, bool incrementListItemVersion, bool doNotFireEvents)
    {
        SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
        if (doNotFireEvents)
        {
            try
            {
                rh.DisableEventFiring();
                item.SystemUpdate(incrementListItemVersion);
            }
            finally
            {
                rh.EnableEventFiring();
            }
        }
        else
        {
            item.SystemUpdate(incrementListItemVersion);
        }
    }

    /// <summary>
    /// Provides ability to copy file from list item without firing event receiver.
    /// </summary>
    public static void CopyTo(this SPFile file, string strNewUrl, bool bOverWrite, bool doNotFireEvents)
    {
        SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
        if (doNotFireEvents)
        {
            try
            {
                rh.DisableEventFiring();
                file.CopyTo(strNewUrl, bOverWrite);
            }
            finally
            {
                rh.EnableEventFiring();
            }
        }
        else
        {
            file.CopyTo(strNewUrl, bOverWrite);
        }
    }


    /// <summary>
    /// Provides ability to update list item without firing event receiver.
    /// </summary>
    public static void SystemUpdate(this SPListItem item, bool doNotFireEvents)
    {
        SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
        if (doNotFireEvents)
        {
            try
            {
                rh.DisableEventFiring();
                item.SystemUpdate();
            }
            finally
            {
                rh.EnableEventFiring();
            }
        }
        else
        {
            item.SystemUpdate();
        }
    }

    /// <summary>
    /// Provides ability to add file to sharepoint library without firing event receiver.
    /// </summary>
    public static SPFile AddFile(SPFileCollection spFileCollection, string destPathToFile, byte[] binFileData, bool overwrite, bool doNotFireEvents)
    {
        SPItemEventReceiverHandling rh = new SPItemEventReceiverHandling();
        if (doNotFireEvents)
        {
            try
            {
                rh.DisableEventFiring();
                SPFile addedFile = spFileCollection.Add(destPathToFile, binFileData, overwrite);
                return addedFile;
            }
            finally
            {
                rh.EnableEventFiring();
            }
        }
        else
        {
            SPFile addedFile = spFileCollection.Add(destPathToFile, binFileData, overwrite);
            return addedFile;
        }
    }

    private class SPItemEventReceiverHandling : SPItemEventReceiver
    {
        public SPItemEventReceiverHandling() { }

        new public void DisableEventFiring()
        {
#pragma warning disable 612,618
            base.DisableEventFiring();
#pragma warning restore 612,618
        }

        new public void EnableEventFiring()
        {
#pragma warning disable 612,618
            base.EnableEventFiring();
#pragma warning restore 612,618
        }
    }
}
Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s