2009-10-16 72 views
8

我一直在網上尋找,發現一些關於這個話題的文章,但我仍然無法弄清楚他們之間的區別。我有下面的代碼顯示,如果我從一個CompositeControl繼承它完美的作品,但不是如果我從一個WebControl繼承。 (他們都渲染代碼,但只有CompositeControl的處理該事件)WebControl和CompositeControl之間的區別?

using System; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace TestLibrary 
{ 
    public class TemplateControl : CompositeControl 
    { 
     TextBox txtName = new TextBox(); 
     TextBox txtEmail = new TextBox(); 
     Button btnSend = new Button(); 

     private void SetValues() 
     { 
      btnSend.Text = "Skicka"; 
     } 

     protected override void CreateChildControls() 
     { 
      SetValues(); 

      this.Controls.Add(new LiteralControl("Namn: ")); 
      this.Controls.Add(txtName); 
      this.Controls.Add(new LiteralControl("<br />")); 
      this.Controls.Add(new LiteralControl("Email: ")); 
      this.Controls.Add(txtEmail); 
      this.Controls.Add(new LiteralControl("<br />")); 
      btnSend.Command += new CommandEventHandler(btnSend_Command); 
      this.Controls.Add(btnSend); 
     } 

     void btnSend_Command(object sender, CommandEventArgs e) 
     { 
      this.Page.Response.Write("Du har nu klickat på skicka-knappen! <br /><br />");     
     } 
    } 
} 

所以,當我按一下按鈕和控制呈現爲WebControl的,沒有任何反應。但是,如果我將WebControl更改爲CompositeControl,則會打印出文本。爲什麼? WebControl和CompositeControl有什麼區別?

回答

16

CompositeControls實施INamingContainerWebControls不。

這兩者之間有更多的差異,但這就是爲什麼複合控件可以將事件路由到子節點但Web控件不能。您可以通過將您的類聲明更改爲:

public class TemplateControl : WebControl, INamingContainer 

瞧,你的按鈕事件現在將被處理!

INamingContainer只是一個標記接口,它告訴ASP.NET控件包含可能需要獨立於其父控件進行訪問的子控件,因此子控件獲得了我們ASP.NET開發人員所瞭解和喜歡的那些額外的漂亮ID (例如,ctl00$ctl00)。

如果WebControl未實現INamingContainer,則不保證孩子的ID是唯一的,因此父母不能可靠地識別它並且不能轉發它的事件。

+1

完美,謝謝! – Patrick 2009-10-16 15:49:56

相關問題