EventHandler(事件处理器)学习

来源:互联网 发布:国外网络电视直播软件 编辑:程序博客网 时间:2024/04/29 09:08

ListTemplateId(在Elements.xml文件中用到)

列表

列表项事件

列表项事件处理器是继承于Microsoft.SharePoint.SPItemEventReceiver的类,以下每一个方法都是一个事件 。

事件名称

事件描述

ItemAdded

列表项添加之后会调用此方法

ItemAdding

列表项添加之前会调用此方法

ItemAttachmentAdded 

附件添加之后调用此方法

ItemAttachmentAdding

附件添加之前调用此方法

ItemAttachmentDeleted

附件删除之后调用此方法

ItemAttachmentDeleting

附件删除之前调用此方法

ItemCheckedIn 

列表项签入之后调用此方法

ItemCheckingIn

列表项签入之前调用此方法

ItemCheckedOut

列表项签出之后调用此方法

ItemCheckingOut

列表项签入之前调用此方法

ItemUncheckedOut

列表项取消签出之后调用此方法

ItemUncheckingOut

列表项取消签出之前调用此方法

ItemDeleted

列表项删除之后调用此方法

ItemDeleting

列表项删除之前调用此方法

ItemUpdated

列表项修改之后调用此方法

ItemUpdating

列表项修改之前调用此方法

ItemFileMoved

列表项文件移动之后调用此方法,只对文档库有效

ItemFileMoving

列表项文件移动之前调用此方法,只对文档库有效

 

1.采用Feature附加处理器

此示例演示当在列表中添加一条记录的时候创建一个网站的简单事件处理程序。此任务包含两个过程:

  • 在 Microsoft Visual Studio 中创建事件处理程序
  • 添加事件处理程序作为 Windows SharePoint Services 中的功能

1.1在 Visual Studio 中创建事件处理程序

通过单击“文件”,指向“新建”,然后单击“项目”以在 Visual Studio 中创建新项目。

  1. 在“新建项目”对话框中,选择“项目类型”框中的“Visual C#”,选择“模板”框中的“类库”,在“名称”框中键入“ItemAddEvent”,然后单击“确定”。
  2. 在解决方案资源管理器中,选择“ItemAddEvent”,然后在“项目”菜单上单击“添加引用”。
  3. 在“添加引用”对话框中,在“.NET”选项卡上选择 Microsoft.SharePoint,然后单击“确定”。
  4. 在代码编辑器中,导入 Microsoft.SharePoint 命名空间,如下所示。

using Microsoft.SharePoint;

  1. 将类的名称更改为CreateAction,并使其从 SPItemEventReceiver 类继承,如下所示。

public class CreateAction: SPItemEventReceiver

  1. 在类中添加下面的代码以重写 ItemAdded方法。(在列表项添加之后的事件)

public override void ItemAdded (SPItemEventProperties properties)

{

   //实例化网站

            using (SPSite site =new SPSite("http://zhangqing:2000"))

            {

                //拿到输入的网站的名称、url、描述

                //取当前站点

                SPWeb myweb = site.OpenWeb("/SJ");

                //取要取数据的列表

                SPListItem oItem = properties.ListItem;

 

                //列表的名称

                string name = oItem["名称"].ToString();

                string url = oItem["url"].ToString();

                string desc = oItem["描述"].ToString();

 

                using (SPWeb web = site.OpenWeb("/AllPrject"))

                {

                    //网站的url,显示名称,描述,中文编码,获取网站模板, 用户权限:  使用与父网站相同的权限    使用独有权限 ,否使用父网站的顶部链接栏

                    web.Webs.Add(url, name, desc, 2052, site.GetCustomWebTemplates(2052)[0],false, false);

                }

            }

}

  1. 在解决方案资源管理器中,右键单击“ItemAddEvent”节点,然后单击“属性”。
  2. 在“属性”对话框中,单击“签名”选项卡,选择“为程序集签名”,选择“选择强名称密钥文件”,然后单击“<新建…>”。
  3. 在“创建强名称密钥”对话框中,在“密钥文件名称”框中键入“DeletingEventHandler.snk”,(可选)指定密钥的密码,然后单击“确定”。
  4. 若要生成项目,请单击“生成”菜单上的“生成解决方案”,或按 Ctrl+Shift+B。
  5. 在 Visual Studio Projects 文件夹中查找 / ItemAddEvent /bin/Debug 文件夹,并将 ItemAddEvent.dll 文件拖动到 C:/WINDOWS/assembly 以将 DLL 放置在全局程序集缓存中。

1.2将事件处理程序作为 Windows SharePoint Services 功能添加

  1. 本地驱动器:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/FEATURES 中创建一个名为“ItemAddEvent”的文件夹。
  2. 在此文件夹中创建一个 Feature.xml文件 文件(如下所示),此文件标识功能及其元素指令清单文件并将功能范围设置为Web site

<Feature Scope="Web"

   Title="Deleting Event Handler" //显示的用户功能名称

   Id="GUID" (自动生成的Guid)

   xmlns="http://schemas.microsoft.com/sharepoint/">

   <ElementManifests>

      <ElementManifest Location="Elements.xml"/>//该代码随后指向存储有关功能本身所有详细信息的第二个 XML文件的位置)

   </ElementManifests>

</Feature>

  1. 若要替换以前的 Id 属性中的 GUID 占位符,请通过运行位于本地驱动器:/Program Files/Microsoft Visual Studio 8 中的 guidgen.exe 来生成 GUID。
  2. 在 ItemAddEvent文件夹中创建一个 Elements.xml 文件,此文件标识作为事件处理程序实现的程序集、类和方法。根据ListTemplateId 属性所指定,此示例将事件处理程序应用于网站的所有通知列表。有关其他默认 Windows SharePoint Services 列表模板类型的 ID,请参阅ListTemplate 元素的 Type 属性说明。

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

   <Receivers ListTemplateId="104">//列表类型

      <Receiver>

         <Name> ItemAddEvent</Name>

         <Type>ItemAdded</Type> //事件类型

         <SequenceNumber>10000</SequenceNumber>//事件执行顺序

         <Assembly> ItemAddEvent, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a26b5449ac4a4cf3</Assembly> //事件处理程序要执行的程序集

         <Class> ItemAddEvent.CreateAction </Class> //事件处理程序要执行的类,及方法名

         <Data></Data>

         <Filter></Filter>

      </Receiver>

   </Receivers>

</Elements>

  1. 若要获取程序集的公钥标记,请在 Windows 资源管理器中查找位于本地驱动器:/WINDOWS/assembly 中的 ItemAddEvent.dll 文件,右键单击此文件,单击“属性”,然后在“属性”对话框的“常规”选项卡上,选择该标记并将其复制。
  2. 在命令提示符下,导航到本地驱动器上的 /Program Files/Common Files/Microsoft Shared/web server extensions/12/BIN,键入下面的每个命令以在部署中安装功能,并在指定子网站上激活功能,然后重置 Microsoft Internet Information Services (IIS),从而使所做更改生效:

stsadm -o installfeature -filename ItemAddEvent /Feature.xml//安装事件

stsadm -o activatefeature -filename ItemAddEvent /Feature.xml  url 指向站点 //激活事件

iisreset

  1. 尝试删除指定网站上的通知列表中的项目,以查看事件处理程序功能的效果。
  2. 卸载事件

停用事件:stsadm -o deactivatefeature -filename ItemAddEvent/Feature.xml -url  http://zhangqing:2000/SJ

卸载事件:stsadm -o uninstallfeature -filename ItemAddEvent/Feature.xml

1.3利用WSP打包解决方案

2.采用代码附加器

因为SPList有一个EventReceivers属性,所以可以通过这个属性操作列表的事件处理。

可以建立一个Winform的程序,当需要附加事件处理器的时候调用即可。

此示例演示当在列表中添加一条记录的时候创建一个网站的简单事件处理程序。

2.1编写事件处理器通用函数

1在“新建项目”对话框中,选择“项目类型”框中的“Visual C#”,选择“模板”框中的“类库”,在“名称”框中键入“CodeEventClass”,然后单击“确定”。

2.在解决方案资源管理器中,选择“CodeEventClass”,然后在“项目”菜单上单击“添加引用”。

3.在“添加引用”对话框中,在“.NET”选项卡上选择 Microsoft.SharePoint,然后单击“确定”。

4.在代码编辑器中,导入 Microsoft.SharePoint 命名空间,如下所示。

using Microsoft.SharePoint;

5.将列的名称改为:EventReceiverManager,类的方法如下:

///<summary>

      ///设置列表的事件处理器

      ///</summary>

      ///<param name="list">要附加事件处理器的列表</param>

      ///<param name="t">事件处理器的类型</param>

      ///<param name="eventData">关联的数据</param>

      ///<param name="eventTypes">事件类型</param>

      public static void SetEventReceivers(SPList list,Type t, string eventData,params SPEventReceiverType[] eventTypes)

      {

          //程序集名称

          string assambly = t.Assembly.FullName;

          //类名

          string className = t.FullName;

          //查看该列表上是否已经有该事件

          for (int i = list.EventReceivers.Count - 1; i >= 0; i--)

          {

              SPEventReceiverDefinition def=list.EventReceivers[i];

              if (def.Class == className)

              {

                  def.Delete();

              }      

          }

          //添加事件处理器

          foreach (SPEventReceiverType etin eventTypes)

          {

              SPEventReceiverDefinition ef = list.EventReceivers.Add();

              ef.Assembly = assambly;

              ef.Class = className;

              //事件处理类型

              ef.Type = et;

              ef.Data = eventData;

              ef.Update();

          }

      }

2.2编写事件处理方法

1.右击项目“CodeEventClass“,右键添加,”类”,类名为:CreateItemReceiver

2.在类中添加下面的代码以重写 ItemAdded方法。(在列表项添加之后的事件)代码如下:

public overridevoid ItemAdded(SPItemEventProperties properties)

        {

            using (SPSite site =new SPSite("http://zhangqing:2000"))

            {

                //拿到输入的网站的名称、url、描述

                //取当前站点

                SPWeb myweb = site.OpenWeb("/Test");

                //取要取数据的列表

                SPListItem oItem = properties.ListItem;

 

                //列表的名称

                string name = oItem["名称"].ToString();

                string url = oItem["url"].ToString();

                string desc = oItem["描述"].ToString();

 

                using (SPWeb web = site.OpenWeb("/AllPrject"))

                {

                    web.Webs.Add(url,name, desc, 2052, site.GetWebTemplates(2052)[1],false, false);

                }

            }

        }

3. 在解决方案资源管理器中,右键单击“CodeEvent”节点,然后单击“属性”。

4.在“属性”对话框中,单击“签名”选项卡,选择“为程序集签名”,选择“选择强名称密钥文件”,然后单击“<新建…>”。

5.在“创建强名称密钥”对话框中,在“密钥文件名称”框中键入“CodeEvent.snk”,(可选)指定密钥的密码,然后单击“确定”。

6.若要生成项目,请单击“生成”菜单上的“生成解决方案”,或按 Ctrl+Shift+B。

7.在 Visual Studio Projects 文件夹中查找 / CodeEvent/bin/Debug 文件夹,并将CodeEvent.dll 文件拖动到 Local_Drive:/WINDOWS/assembly 以将 DLL 放置在全局程序集缓存中。

2.3附加处理器

1在“新建项目”对话框中,选择“项目类型”框中的“Visual C#”,选择“模板”框中的“Windows控制台应用程序”,在“名称”框中键入“CodeEvent”,然后单击“确定”。

2.在解决方案资源管理器中,选择“CodeEvent”,然后在“项目”菜单上单击“添加引用”。

3.在“添加引用”对话框中,在“.NET”选项卡上选择 Microsoft.SharePoint,然后单击“确定”。

4.在代码编辑器中,导入 Microsoft.SharePoint 命名空间,如下所示。

using Microsoft.SharePoint;

1.       在Form1上可以添加一个按钮来附加事件处理器。按钮的方法如下:

 

  using (SPSite site =new SPSite("http://zhangqing:2000"))

            {

                using (SPWeb web = site.OpenWeb("/Test"))

                {

                    SPList list=web.Lists["项目信息"];

                    //调用事件处理器通用方法

     EventReceiverManager.SetEventReceivers(list,typeof(CreateItemReceiver),"",SPEventReceiverType.ItemAdded);

                  

                }

         }

3.Feature附加器和代码附加器的优缺点

3.1Feature附加器

优点:使用比较灵活,可以设置功能的范围(通过Feature.xml中的Scope属性设置,可以是FORM,WebApplication,Site,Web,List),只需安装一次就可以设置到同类别的多个列表上。

缺点:设置比较麻烦。

3.2代码附加器

优点:操作比较简单

缺点:只能为某一个列表附加处理器

文档库

文档库事件

Ø  需要从IListEventSink继承,并且重载OnEvent(SPListEvent)方法。

例子:将EventHandler附加到文档库。当文档库添加一个文件的时候,向D盘添加一个文件,删除的时候,给相关人员上发送一个邮件。当然同样也可以跟数据库连接。

  classDocEventHandler:IListEventSink

    {

        public void OnEvent(SPListEvent oListEvent)

        {

            if (oListEvent.Type ==SPListEventType.Insert)

            {

                //当插入时想做的操作            }

            else if(oListEvent.Type==SPListEventType.Delete)

            {

              //当删除时想做的操作            }

        }

部署

可以采用以上的Feature附加器和代码附加器。部署方法一样。

 

原创粉丝点击