2009-06-09 21 views
8

Al agregar controles a un formulario en tiempo de ejecución, puede hacer cualquiera de los siguientes:La mejor práctica para agregar controles en tiempo de ejecución

Button btn = new Button(); 
//... 
this.Controls.Add(btn); 

o

Button x = new Button(); 
//... 
btn.Parent = this; 

Yo había asumido que eran lo mismo, y fue solo por preferencias personales la forma de hacerlo, pero alguien en el trabajo mencionó que el segundo método es peor ya que el botón no se eliminará cuando se elimine el formulario (suponiendo que no se hayan agregado controladores de eventos y siendo retenido).

Esto no tenía mucho sentido para mí, así que eché un vistazo en línea, pero no pude encontrar nada que decir de una forma u otra.

¿Alguien sabe la respuesta o puede señalarme en la dirección correcta?

+0

Probablemente se refiera a esto.Controles.Agregar ... –

+0

Su derecho, corregido. – Pondidum

+0

Duplicado: http://stackoverflow.com/questions/961554/difference-between-setting-control-parent-property-and-using-controls-add – RSolberg

Respuesta

12

Dado que especular es una pérdida de tiempo, agarré mi copia de Reflector y eché un vistazo al código real. La propiedad Parent llama a la propiedad ParentInternal, que a su vez llama value.Controls.Add (este)

/* this code is part of the .NET Framework was decompiled by Reflector and is copyright Microsoft */ 
    internal virtual Control ParentInternal 
    { 
     get 
     { 
      return this.parent; 
     } 
     set 
     { 
      if (this.parent != value) 
      { 
       if (value != null) 
       { 
        value.Controls.Add(this); 
       } 
       else 
       { 
        this.parent.Controls.Remove(this); 
       } 
      } 
     } 
    } 

Basándose en este código, los métodos son equivalentes y esta es estrictamente una cuestión de preferencia.

+0

oh. ¡me ganaste! nadie debería estar sin el reflector. – PeterAllenWebb

+3

Para fines de soporte, .Parent es mucho más difícil de leer e interpretar que .ControlsAdd(); – RSolberg

+0

@RSolberg - No estoy en desacuerdo con que Controls.Add sea más explícito, pero esta no fue la pregunta planteada. La pregunta es si habrá problemas con Dispose usando el patrón .Parent. Según el código real, no habrá ninguno. –

-1

creo que tanto resultado a la misma cosa

3

Siempre he preferido la identificación de los controles de la cual los objetos que voy a añadir el nuevo mando a ...

Button btn = new Button(); 
this.PlaceHolder1.Controls.Add(btn); 

Button btn2 = new Button(); 
this.PlaceHolder2.Controls.Add(btn2); 

Siento que esto es más fácil de leer y no tiene que hacer ningún análisis de árbol genealógico para descubrir quién es el padre ...

Creo que el uso del código .Parent internamente hace .Controls.Add, por lo que deberían tener el mismo resultado final, pero para mí todo se reduce a la legibilidad del código.

Hay una pregunta similar aquí en StackOverflow.

-1

personalmente me gusta

Button btn = new Button(); 
//... 
this.Controls.Add(btn); 

Porque, es más explícito y código legible.

3

Veo dónde el descarte del botón podría ser un problema si está escribiendo una aplicación que está abriendo y cerrando muchas formas durante su duración. Debería asegurarse de tener a mano un código de eliminación adecuado para asegurarse de que la aplicación no absorba demasiada memoria.

Dejando eso de lado, me gusta la primera afirmación porque explica más claramente lo que está haciendo su código. Está creando un botón nuevo y lo está agregando a los controles existentes en la página. Puede leer más allá de esto al depurar/refactorizar y comprender lo que está sucediendo. En el segundo grupo de código, esto es un poco más vago. Si pasó por encima de la declaración del botón inicial y vio btn.Parent = esta declaración, podría hacerle creer que estaba reasignando el botón a una nueva forma, o algo por el estilo.

Suena un poco quisquilloso, pero últimamente he estado ayudando a algunos compañeros de trabajo mostrándoles algo de mi código y estoy descubriendo que, aunque definitivamente hay más de 1 manera de despellejar a un gato, a veces hay una cierta manera de desollarlo que se explica mucho mejor cuando se mira en el futuro.

1

En el segundo caso, el control puede no eliminarse cuando el formulario lo hace (no estoy seguro de si lo hace o no), pero debe ser liberado por la próxima ronda de recolección de basura de todos modos, ya que no debería No hay ninguna referencia dura después de la eliminación del formulario. El resultado es que si el botón se elimina con el formulario no es un problema para la mayoría de las aplicaciones.En la gran mayoría de las aplicaciones que usan formularios, el usuario es el cuello de botella, por lo que si debe esperar uno o dos pases del recolector de basura antes de que se elimine una colección de controles de formulario, esto no debería afectar su decisión de diseño.

Dicho esto, prefiero

this.Controls.Add(btn); 

porque parece ser más semánticamente correcta de lo que está haciendo realidad. Siempre utilizo este método en lugar de configurar la propiedad Control.Parent.

0

Es realmente una cuestión de gusto. Esto es lo que sucede cuando establece la propiedad Parent en un Control. Este código viene cortesía de .NET Reflector.

set 
{ 
    if (this.parent != value) 
    { 
     if (value != null) 
     { 
      value.Controls.Add(this); 
     } 
     else 
     { 
      this.parent.Controls.Remove(this); 
     } 
    } 
} 
Cuestiones relacionadas