2009-10-16 12 views
8

Mi sono guardato intorno sul web e ho trovato alcuni articoli sull'argomento, ma non riesco ancora a capire la differenza tra loro. Ho il codice mostrato sotto, se eredito da un CompositeControl funziona perfettamente, ma non se eredito da un WebControl. (Entrambi rendono il codice, ma solo il CompositeControl gestisce l'evento)Differenza tra un WebControl e un 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 />");     
     } 
    } 
} 

Così, quando si fa clic sul pulsante e il controllo è reso come un WebControl, non succede nulla. Ma se cambio il WebControl in un CompositeControl, il testo viene stampato. Perché? Qual è la differenza tra WebControl e CompositeControl?

risposta

16

CompositeControls attuare INamingContainer mentre WebControls no.

Ci sono più differenze tra i due, ma è per questo che il controllo composito può instradare l'evento a suo figlio ma il controllo Web non può. Puoi vedere questo modificando la tua dichiarazione di classe a questo:

public class TemplateControl : WebControl, INamingContainer 

Voilà, il tuo evento pulsante sarà ora gestito!

INamingContainer è solo un'interfaccia marcatore che indica a ASP.NET un controllo contiene i bambini a cui potrebbe essere necessario accedere indipendentemente dal controllo genitore, quindi i controlli figlio ottengono quegli id ​​più belli che noi sviluppatori ASP.NET abbiamo imparato a conoscere e ad amare (ad esempio, ctl00$ctl00).

Se lo non implementa INamingContainer, l'ID figlio non può essere considerato univoco, pertanto il genitore non può identificarlo in modo affidabile e non può inoltrarlo.

+1

Perfetto, grazie! – Patrick