我有一个处理评论的控件。在此控件中,我设置了一个用于发送电子邮件的委托事件处理程序。
然后,我有各种类型的控件,例如博客,文章等,每个都可以添加或不添加评论控件(这是我不知道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搜索作为初始控件,我担心会花时间搜索控制树来查找它。每种不同类型的页面在控制它的程度上会有所不同。在某些测试中,它会很快返回结果。
答案 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之后,所以要小心。
干杯,
安德烈