2009-10-16 9 views
8

He estado buscando en la web y encontré algunos artículos sobre el tema, pero todavía no puedo entender la diferencia entre ellos. Tengo el siguiente código: si heredo de un CompositeControl, funciona perfectamente, pero no si heredo de un WebControl. (Ambos hacen que el código, pero sólo el CompositeControl controla el evento)Diferencia entre un control web y un control compuesto?

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 />");     
     } 
    } 
} 

Así que cuando hago clic en el botón y el control se representa como un WebControl, no pasa nada. Pero si cambio WebControl a CompositeControl, el texto se imprime. ¿Por qué? ¿Cuál es la diferencia entre WebControl y CompositeControl?

Respuesta

16

CompositeControls implementar INamingContainer mientras WebControls do not.

Existen más diferencias entre las dos, pero es por eso que el control compuesto puede enrutar el evento a su hijo pero el control web no. Puede ver esto cambiando su declaración de clase a esta:

public class TemplateControl : WebControl, INamingContainer 

Voila, su evento de botón ahora será manejado!

INamingContainer es solo una interfaz de marcador que le dice a ASP.NET que un control contiene elementos secundarios a los que se debe acceder independientemente del control principal, de modo que los controles secundarios obtienen esos identificadores bonitos que los desarrolladores de ASP.NET hemos llegado a conocer y amar (por ejemplo, ctl00$ctl00).

Si el WebControl no implementa INamingContainer, no se garantiza que la identificación del hijo sea única, por lo que el padre no puede identificarla de manera confiable y no puede reenviar eventos.

+1

Perfecto, gracias! – Patrick

Cuestiones relacionadas