定制一个简单的EventHandle
相信朋友对现实中的各种事件的处理应该都有自己的一套法宝,但对MOSS的EventHandle 应该耍啥法宝呢?呵呵其实,对他也没宝好耍的!对吧!它只要能完成我们在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 啦!
给上方代码做个解释把:有人会想 为什么不从小到大删呢?其实刚开始笔者也这样想过,后面才清楚,首先我们要清楚默认的索引序号从零开始,以上方来说明那就是0,1,2(红色标记),代码是从大到小删,首先事件总数是3.减一个就是2咯,那就是从序号为2的开始删,后面就是1,0。那我们看下如果是从小到大删是什么样的结果:首先for(int i>=0;i=< list.EventReceivers.Count - 1;i++) 这是上第一条就是上方红色的0,这是i自增变为1,有人往往这样想,那不就是吧上方红色的1那条事件给删了吗?其实不是的。上方红色为1的那条事件,索引序号就变为0(蓝色),而之前为红色2的序号就变为1(蓝色)咯。那到最后面变成第2条事件就没被删除。不懂这样说打家明不明白。