现在的位置: 首页 > 综合 > 正文

定制一个简单的EventHandle

2013年01月01日 ⁄ 综合 ⁄ 共 5466字 ⁄ 字号 评论关闭

相信朋友对现实中的各种事件的处理应该都有自己的一套法宝,但对MOSSEventHandle 应该耍啥法宝呢?呵呵其实,对他也没宝好耍的!对吧!它只要能完成我们在MOSS想完成的各种事件它自己就提前变成一套法宝了,干嘛给你耍。。。!可能大家比较熟悉的应该是列表事件吧,笔者觉得列表事件的却在MOSS里面占领了一些天下。列表库旗下的小弟也多,所以~~~。不够比较常用的还有Feature事件,不够Feature事件,没有同异步时间发生机制而列表事件是有的(笔者这样说怪怪的,有错指出来我感激不尽的哦),前者是继承SPItemEventReceiver接口,后者是继承SPFeatureReceiver。 在下一篇章笔者会将两者合并起来应用,双剑合璧的威力如何请看下回。

现在步入正题:

1.   首先打开VS创建一个空白解决方案,添加一个类库和一个窗口应用程序,添加结构如图。2。在类库项目点击属性:注册强名称,在生成事件后:copy "$(TargetDir)*.dll" C:\WINDOWS\assembly 3.记得添加SharePoint程序集(老规矩了)

项目结构图:

(2)创建一个数据库MeetingDate,再创建Meeting表(把会议记录写入数据库)

3)在自己指定的站点创建爱你一个列表为日常会议通知,在设置里把标题栏的值设为可以为空(相信大家这个应该都会把!该列表我设了会议标题,部门,会议事件,会议地址,会议时间,想达到的效果就是用列表事件进行控制,笔者带回故意不写标题!)

这是还没对项目开发时,列表所呈现的效果。标题为空

 

 

项目代码:

MeetingNote.CS

using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.SharePoint;

using System.Data.SqlClient;

 

namespace MeetingEvent

{

//继承SPItemEventReceiver

 

    class MeetingNote:SPItemEventReceiver

    {

//重写它其中的三个虚方法,这里实现异步增删改,假如要阻止用户删除,您就可以重写

//public override void ItemDeleting(SPItemEventProperties properties)方法实现列表同步事件。阻止//用户删除。

        public override void ItemAdded(SPItemEventProperties properties)

        {

            this.ItemEvent(properties);

        }

        public override void ItemUpdated(SPItemEventProperties properties)

        {

            this.ItemEvent(properties);

        }

        public SqlConnection connectiongstring()

        {

            SqlConnection con = new SqlConnection("Data source=MOSINGSERVER;Database=MeetingDate;integrated security=true");

            con.Open();

            return con;

 

        }

 

        public override void ItemDeleted(SPItemEventProperties properties)

        {

            SPListItem listitem = properties.ListItem;

            string MeetingID = listitem.ID.ToString();

            SqlConnection con = connectiongstring();

            SqlCommand cmd = new SqlCommand("delete from Meeting where MeetingID='" + Convert.ToInt32(MeetingID) + "'", con);

            cmd.ExecuteNonQuery();

            con.Close();

            listitem.Update();

        }

 

        public void ItemEvent(SPItemEventProperties properties)

        {

            SPListItem listitem = properties.ListItem;

            string MeetingID = listitem.ID.ToString();

            string Dept = listitem["部门"].ToString();

            string Meetingadress = listitem["会议地点"].ToString();

            string MeetingTime = Convert.ToDateTime(listitem["会议时间"]).ToString();

            listitem["会议标题"] = "请" + Dept + "部门,于" + "(" + MeetingTime + ")" + "在" + Meetingadress + "开会";

            listitem.Update();

            string MeetingTitle = listitem["会议标题"].ToString();

            SqlConnection con = connectiongstring();

            SqlCommand cmd = new SqlCommand("select MeetingID from Meeting where MeetingID='" + Convert.ToInt32(MeetingID) + "'", con);

            if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)

            {

                SqlCommand cmd = new SqlCommand("update Meeting set MeetingTitle='" + MeetingTitle + "',Dept='" + Dept + "',Meetingadress='" + Meetingadress + "',MeetingDate='" + Convert.ToDateTime(MeetingTime) + "'where MeetingID='" + Convert.ToInt32(MeetingID) + "'", con);

                cmd.ExecuteNonQuery();

                con.Close();

 

            }

            else

            {

                SqlCommand cmd = new SqlCommand("insert into Meeting(MeetingTitle,Dept,Meetingadress,MeetingDate)values('" + MeetingTitle + "','" + Dept + "','" + Meetingadress + "','" + Convert.ToDateTime(MeetingTime) + "')", con);

                cmd.ExecuteNonQuery();

                con.Close();

            }

        }

    }

}

 

 

Program.cs代码:

using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.SharePoint;

 

namespace RunMeetinEvent

{

    class Program

    {

        static void Main(string[] args)

        {

            SPSite site = new SPSite("http://mosingserver:8080");

            SPWeb web = site.OpenWeb();

            SPList list = web.Lists["日常会议通知"];

            string assemble = "MeetingEvent, Version=1.0.0.0, Culture=neutral, PublicKeyToken=43c7ec07d2fa840c";

//assemblyname 可以在assembly 文件夹找到你生成的程序集,然后点击属性查看,或者直接去下载一

个.net refelctor,打开运行,把程序集拖过去直接获取这一串数值。

            string classname = "MeetingEvent.MeetingNote";

            list.EventReceivers.Add(SPEventReceiverType.ItemAdded,assemble,classname);

            list.EventReceivers.Add(SPEventReceiverType.ItemUpdated,assemble,classname);

            list.EventReceivers.Add(SPEventReceiverType.ItemDeleted,assemble,classname);

            //清楚列表增删改的事件。

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

            //{

              // list.EventReceivers[i].Delete();

 

            //}

            Console.Write("恭喜Van!运行成功!");

        }

    }

}

 

Strep2.

项目生成成功之后记得IISRESET

 

点击项目生成的RunMeetinEvent.exe

返回列表,重新添加一条通知项目

 进去数据表看下:这是就有了刚填充的数据,做一个记录归档,方便会议人员作统计。(笔者举的例子,不是很好,大家还是活学活用吧!

最后有人可能会问,那我要关闭这个事件功能怎么办

 

解决办法:

Program.cs代码:

using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.SharePoint;

 

namespace RunMeetinEvent

{

    class Program

    {

        static void Main(string[] args)

        {

            SPSite site = new SPSite("http://mosingserver:8080");

            SPWeb web = site.OpenWeb();

            SPList list = web.Lists["日常会议通知"];

            string assemble = "MeetingEvent, Version=1.0.0.0, Culture=neutral, PublicKeyToken=43c7ec07d2fa840c";

//assemblyname 可以在assembly 文件夹找到你生成的程序集,然后点击属性查看,或者直接去下载一

个.net refelctor,打开运行,把程序集拖过去直接获取这一串数值。

           //清除列表增删改的事件。

把注销清除列表增删改的事件下面的代码用上,然后重新生成项目RunMeetingEvent项目,执行生成的可执行文件就OK 啦!

给上方代码做个解释把:有人会想 为什么不从小到大删呢?其实刚开始笔者也这样想过,后面才清楚,首先我们要清楚默认的索引序号从零开始,以上方来说明那就是012(红色标记),代码是从大到小删,首先事件总数是3.减一个就是2咯,那就是从序号为2的开始删,后面就是10那我们看下如果是从小到大删是什么样的结果:首先for(int i>=0;i=< list.EventReceivers.Count - 1;i++) 这是上第一条就是上方红色的0,这是i自增变为1,有人往往这样想,那不就是吧上方红色的1那条事件给删了吗?其实不是的。上方红色为1的那条事件,索引序号就变为0(蓝色),而之前为红色2的序号就变为1(蓝色)咯。那到最后面变成第2条事件就没被删除。不懂这样说打家明不明白。

 

抱歉!评论已关闭.