[英]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.