繁体   English   中英

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

[英]Assign delegate event handler from dynamically added child control

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

然后,我有各种类型的控件,例如博客,文章等,每种控件都可以添加也可以不添加评论控件(这是我不知道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作为初始控件进行搜索,我担心在搜索控件树以查找它时所花费的时间。 每种不同类型的页面在控制多少方面将有所不同。 在某些测试中,它会很快返回结果。

您可以覆盖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之后发生,所以要小心。

干杯,

安德烈

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM