1、首先打开Microsoft Visual Studio 2005,创建一个Class Library的项目,取名为EventHandler

MOSS2007对列表开发EventHandler_vs2005

2、创建项目成功后,将默认的Class1.cs改名为EventHandlerTest.cs,并添加Microsoft.SharePoint.dll的引用,该DLL的具体位置在C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI。

3、在EventHandlerTest.cs里添加如下代码


using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
namespace EventHandler
{
    public class EventHandlerTest:SPItemEventReceiver
    {
        public override void ItemAdded(SPItemEventProperties properties)
        {
            DisableEventFiring();
            SPListItem item = properties.ListItem;
            string name = item["入职者"].ToString();
            string date = Convert.ToDateTime(item["入职时间"]).ToShortDateString();
            item["标题"] = name + "("+date+")";
            item.Update();
        }
        public override void ItemUpdated(SPItemEventProperties properties)
        {
            SPListItem item = properties.ListItem;
            string name = item["入职者"].ToString();
            string date = Convert.ToDateTime(item["入职时间"]).ToShortDateString();
            item["标题"] = "更新"+name + "(" + date + ")";
            this.DisableEventFiring();
            item.Update();
            this.EnableEventFiring();
        }
        public override void ItemDeleting(SPItemEventProperties properties)
        {
            properties.ErrorMessage = "不能删除入职列表中的条目";
            properties.Cancel = true;
        }
    }
}

上面的"入职者"、"标题"、"入职时间"是指的列表中的标题项目MOSS2007对列表开发EventHandler_eventhandler_02

这里边继承了SPItemEventReceiver类。 重写了3个事件,分别实现的功能是,当添加后、修改后触发的事件\当删除前触发的事件.MOSS2007 支持同步和异步事件,也就是ItemDeleted(删除后)、ItemDeleting(删除前)

DisableEventFiring();  这句话的意思是 ,禁止触发其他事件.因为每次增加都会去触发UPDATE事件,所以就会更新两次,看一段网上的原话。

  1. 问题:

  2. 最近在开发Eventhandler的时候发现ItemAdded这个方法中如果有对列表项进行更新操作,即执行了item.Update() ,那么就会触发ItemUpdated这个eventhandler事件,我们的本意是编辑,修改的时候

  3. 去触发ItemUpdated这个eventhandler

  4. publicoverridevoid ItemAdded(SPItemEventProperties properties)

  5. {     …

  6. properties.ListItem.Update();

  7. }

  8. publicoverridevoid ItemUpdated(SPItemEventProperties properties)

  9. {

  10. //update code here

  11. }

  12. 解决办法:

  13. 添加DisableEventFiring() 这个方法,阻止其他事件被调用

  14. publicoverridevoid ItemAdded(SPItemEventProperties properties)

  15. {

  16.     DisableEventFiring(); //Prevents events from being raised.

  17.     …

  18. properties.ListItem.Update();

  19. }

  20. 或者不使用properties.ListItem.Update();

  21. 改为properties.ListItem.SystemUpdate();

4、为项目创建一个强名称。点项目名,右键-属性,出来下面界面。

MOSS2007对列表开发EventHandler_MOSS2007_03

然后点[生成],我的是中文版vs2005。然后将C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\EventHandler\EventHandler\bin\Debug编译出来的EventHandler.dll拖到放到GAC目录中(C:/WINDOWS/assembly)里。

-----------------------------------------------------------------------------------------

下面说下部署EventHandler吧,还有就是用代码,我们新建个控制台程序,在program.cs里的代码为,这里同样也要加载上面的Microsoft.SharePoint.dll.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
namespace EventHandlerConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            SPSite collection = new SPSite("http://moss2007/");
            SPWeb site = collection.OpenWeb();
            SPList hrlist = site.Lists["入职表"];
            string assName = "EventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dce19f87c0661759";
            string className = "EventHandler.EventHandlerTest";
            hrlist.EventReceivers.Add(SPEventReceiverType.ItemAdded,assName,className);
            hrlist.EventReceivers.Add(SPEventReceiverType.ItemUpdated,assName,className);
            hrlist.EventReceivers.Add(SPEventReceiverType.ItemDeleting,assName,className);
            //这段是执行删除那些事件
            //for (int i = hrlist.EventReceivers.Count - 1; i >= 0;i-- )
            //{
            //    hrlist.EventReceivers[i].Delete();
            //}
            Console.WriteLine("It's OK");
            Console.ReadLine();
        }
    }
}

这段代码"EventHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dce19f87c0661759"是使用Reflector工具找出EventHandler.dll的Assembly信息

SPSite collection = newSPSite("http://moss2007/");
SPWeb site = collection.OpenWeb();
SPList hrlist = site.Lists["入职表"];

这些代码的意思是,打开MOSS2007对列表开发EventHandler_vs2005_04,然后打开列表MOSS2007对列表开发EventHandler_vs2005_05

最后重启iisreset


借鉴的提示网址:http://tech.ddvip.com/2008-10/122535924187275.html

http://blog.csdn.net/wuhongyao3/article/details/2968309

http://down.51cto.com/data/487359