从动态添加的子控件中分配委托事件处理程序

时间:2010-04-14 03:22:27

标签: c# asp.net events event-handling

我有一个处理评论的控件。在此控件中,我设置了一个用于发送电子邮件的委托事件处理程序。

然后,我有各种类型的控件,例如博客,文章等,每个都可以添加或不添加评论控件(这是我不知道id动态完成的),即评论控件被添加到该控件之外。这些控件中的每一个都以不同的方式处理它的电子邮件(因此事件)。

我想要确定的是如何在父控件中分配事件。目前,我不得不递归搜索页面上的所有控件,直到找到注释控件,然后设置它。以下示例说明:

评论控制

public delegate void Commenting_OnSendEmail();

public partial class Commenting : UserControl
{
   public Commenting_OnSendEmail OnComment_SendEmail();

   private void Page_Load(object sender, EventArgs e)
   {
      if(OnComment_SendEmail != null)
      {
          OnComment_SendEmail();
      }
   }
}

家长控制

public partial class Blog : UserControl
{
   private void Page_Load(object sender, EventArgs e)
   {
      Commenting comControl = (Commenting)this.FindControl<Commenting>(this);
      if(comControl != null)
      {
         comCtrol.OnComment_SendEmail += new Commenting_OnSendMail(Blog_Comment_OnSendEmail);
      }
   }
}

有更简单的方法吗?

修改

我问的原因是,如果我从this.Page搜索作为初始控件,我担心会花时间搜索控制树来查找它。每种不同类型的页面在控制它的程度上会有所不同。在某些测试中,它会很快返回结果。

1 个答案:

答案 0 :(得分:0)

您可以覆盖Blog类的AddedControl事件,并检查添加的控件是否为Commenting类型的实例。类似的东西:

public partial class Blog : UserControl { 

    protected override void AddedControl(Control control, int index) {
      base.AddedControl(control, index);

      Commenting commentingControl = control as Commenting;
      if (commentingControl == null) return;

      commentingControl.OnComment_SendEmail += new Commenting_OnSendMail(Blog_Comment_OnSendEmail);
    }
}

当然,您可以将此代码放在所有“可注释”用户控件的基类上,并使用抽象方法来实际处理事件。

只有一件事:AddControl事件发生在Page_Load之后,所以要小心。

干杯,

安德烈