2010-02-17 14 views
9

¿Cómo puedo insertar dinámicamente un control antes de otro control en asp.net? Digamos que control1 es un poco de control en la página web y quiero crear e insertar dinámicamente una tabla justo antes de control1.Insertar un control antes de otro control

p. Ej.

table1 = new Table(); 
table1.ID = "Table1"; 

pero ¿qué viene después? Para agregar un control como un niño lo haría: control1.Controls.Add(table1);, pero ¿cómo diablos inserto table1 como el hermano anterior de control1?

Respuesta

16

Si desea que el nuevo control (controlB) sea inmediatamente antes de controlA, puede determinar el índice de controlA en la colección Page.Controls, e insertar controlB en ese lugar. Creo que esto aumentará en un índice controlA, convirtiéndolos en hermanos inmediatos según lo deseado.

if(Page.Controls.IndexOf(controlA) >= 0) 
    Page.Controls.AddAt(Page.Controls.IndexOf(controlA), controlB); 

Editar:

Una nota más - lo anterior asume el control A y B están en el nivel de página raíz. También es posible usar la propiedad Parent para asegurar la inserción de hermanos funciona sin importar dónde controlA se sienta en la jerarquía de la página:

Control parent = controlA.Parent; 

if(parent != null && parent.Controls.IndexOf(controlA) >= 0) 
{ 
    parent.Controls.AddAt(parent.Controls.IndexOf(controlA), controlB); 
} 

yo realmente prefiero este método, ya que es más flexible y no se basa en la Page.

+0

Gracias, más útil. –

+2

¿En qué evento llamarías esto? Porque siempre obtengo La colección de control no se puede modificar durante las fases DataBind, Init, Load, PreRender o Unload. –

0

¿Has probado control1.Controls.AddAt(0, table1)? Por extraño que no llamaran al método Insertar como la mayoría de los otros tipos de colección.

+0

¿No controlaría1.Controles ser los controles secundarios de control1? Necesito insertarlo justo antes del control1, en el mismo nivel. –

+0

¡Vaya! Lo siento, he entendido mal. Parece que has encontrado una solución. –

Cuestiones relacionadas