在实际项目开发过程中,大家可能会遇到这样一个简单的问题:在一个列表中有很多字段,其中有一个或是多个字段不能让用户操作。这一个或是多个字段需要用户在进行更新操作的时候进行相应的更新。例如,在我做的一个项目当中,有这么一个逻辑过程,用户对一条信息进行受理和处理(此条信息已经存在)。在受理和处理的时候(即更新这条数据的时候),需要自动把受理时间或是处理时间添加到相应的“栏”中。这个时候,就需要写一段EventHandler。
我在写这个EventHandler过程中遇到一个大问题,可能对大家这种Sharepoint老手来说不是问题,而我只是刚刚上班的小菜鸟,而这就成了我的问题。我也是一步一步琢磨出来的。废话不多说,先贴代码:
1 public override void ItemUpdating(SPItemEventProperties properties) 2 { 3 base.ItemUpdating(properties); 4 try 5 { 6 7 //受理和处理时间的添加 8 SPItemEventDataCollection AfterData = properties.AfterProperties; 9 object slPeople = AfterData["shoulicaozuoren"]; 10 object clPeople = AfterData["chulicaozuoren"]; 11 string sp = slPeople.ToString(); 12 //SPWeb web = properties.OpenWeb(); 13 //SPList list = web.Lists[properties.ListId]; 14 //SPListItem item = list.GetItemById(properties.ListItemId); 15 if (sp != "" && clPeople == null && properties.ListItem["申请状态"].ToString() == "已提交") 16 { 17 AfterData["shoulishijian"] = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"); 18 } 19 else if (clPeople != null && sp != "") 20 { 21 AfterData["chulishijian"] = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"); 22 } 23 else if (clPeople != null && sp == "") 24 { 25 AfterData["chulishijian"] = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"); 26 AfterData["shoulishijian"] = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ"); 27 AfterData["shoulicaozuoren"] = "无"; 28 AfterData["shouliyijian"] = "此申请没有经历受理阶段,直接进入处理阶段。"; 29 } 30 else 31 { 32 return; 33 } 34 //item.Update(); 35 //base.DisableEventFiring(); 36 //properties.ListItem.Update(); 37 //base.EnableEventFiring(); 38 } 39 catch 40 { } 41 42 }
大家可以看到我把这段代码写到了ItemUpdating方法中了,从我注释掉的代码中也可以看到,我进入了一个误区:想在此处更改数据后再次Update,我不用说大家也可以想象的到,如果这样写的话最后就有一个结果,那就是“死循环”。经过个人的思考和资料的查询,我发现其实没有想象的那么麻烦,使用properties.AfterProperties即可,因为是在数据还没有提交的状态下,所以可以把即将更新的数据某个栏更新一下。那么,列表最终更新栏的数据就是这两处更新的集合。根本不用再次使用Update。
此篇博文只是为了提醒自己不要第2次进入误区,也希望能够帮助被此问题困扰的人。