簡體   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