委托事件的实际运用 itprobie

1>事件在try catch中的运用

在多层架构中try catch事件类似于冒泡,如果不对代码做任何处理,无论哪一层发生异常,都会在最顶层的ul层显示出异常信息。所以个人观点,异常的捕获工作最好在ul层。这样所有层级报的异常都可以被捕获到,因为错误会像气泡一样最终会在显示层暴露出来。在每次设计到数据库的时候捕获异常,这样每个页面的数据操作都会被try catch包裹,有没有一种更好得方法,让代码更简洁。答案是肯定的。将控件事件包裹起来,重新申明一个事件,在该事件中调用控件的事件,并且捕获异常。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.UI;
 6 using System.Web.UI.WebControls;
 7 
 8 using System.Reflection;
 9 
10 public partial class _Default : System.Web.UI.Page
11 {
12     protected void Page_Load(object sender, EventArgs e)
13     {
14         btn.Click += new EventHandlerWrap(btn_Click);
15     }
16 
17     protected void btn_Click(object sender, EventArgs e)
18     {
19         lbTime.Text = DateTime.Now.ToString();
20     }
21 }
22 public class EventHandlerWrap
23 {
24     private EventHandler handler;
25     private EventHandler Handler;
26     public EventHandlerWrap(EventHandler handler)
27     {
28         this.handler = handler;
29         Handler = InVoke;
30     }
31 
32     public static implicit operator EventHandler(EventHandlerWrap wrap)
33     {
34         return wrap.Handler;
35     }
36 
37     private void InVoke(object sender, EventArgs e)
38     {
39         try
40         {
41             this.handler(sender, e);
42         }
43         catch (Exception ex)
44         {
45             LogError(ex.Message);
46         }
47     }
48 
49     private void LogError(string errorMsg) { }
50 }

 2>事件在用户控件中运用

项目中会设计到报表的流程流转,用到了公司自己研发的工作流,该工作流的功能关联了报表的删除以及状态的显示,所以不同的报表都会添加该工作流,这会导致一个问题的出现,每个页面都必须添加工作流,实现删除功能和状态显示,重复的工作就出现了,所以最总的选择是将工作流的操作和状态封装到自定义空间中。状态的显示可以从工作流实例中通过id获取,但是报表的删除则需要知道具体的表,所以必须把删除操作放在页面,解决的方案是在用户控件中申明一个事件,将删除的操作委托到具体的每个表报的页面中。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.UI;
 6 using System.Web.UI.WebControls;
 7 
 8 public partial class UserControls_WorkFlow : System.Web.UI.Page
 9 {
10     public EventHandler Delete;
11     protected void Page_Load(object sender, EventArgs e)
12     {
13 
14     }
15     protected void lbnDel_Click(object sender, EventArgs e)
16     {
17         if (Delete != null)
18             Delete(sender, e);
19     }
20 }
原文地址:https://www.cnblogs.com/guohu/p/2696255.html