2011-06-14 11 views
6

He desarrollado un tablero web que tiene una estructura de controles incrustada dentro de los controles. En muchos escenarios, tengo la ID de un control y necesito estar trabajando en el objeto de control real. Como tal, utilizo un método de utilidad, una implementación FindControl recursiva, que busca en la página (o cualquier otro objeto provisto, pero siempre uso la página), para la identificación del control.Luchando para alejarme del recursivo Page.FindControl

/// <summary> 
/// Page.FindControl is not recursive by default. 
/// </summary> 
/// <param name="root"> Page </param> 
/// <param name="id"> ID of control looking for. </param> 
/// <returns> The control if found, else null. </returns> 
public static Control FindControlRecursive(Control root, string id) 
{ 
    if (int.Equals(root.ID, id)) 
    { 
     return root; 
    } 

    foreach (Control control in root.Controls) 
    { 
     Control foundControl = FindControlRecursive(control, id); 

     if (!object.Equals(foundControl,null)) 
     { 
      return foundControl; 
     } 
    } 

    return null; 
} 

Esta función tiene la capacidad de volverse bastante lenta. Me di cuenta cuán lento una vez que puse log4net iniciando sesión en él. Ahora trato de alejarme de donde pueda, pero no estoy seguro de qué otras opciones tengo, si es que tengo alguna.

Por ejemplo, el usuario arrastra y suelta un control en mi página web. El controlador de eventos es el siguiente:

protected void RadListBox_Dropped(object sender, RadListBoxDroppedEventArgs e) 
{ 
    //e.HtmlElementID is the UniqueID of the control I want to work upon. 
    RadDockZone activeControlDockZone = Utilities.FindControlRecursive(Page, e.HtmlElementID) as RadDockZone; 
} 

No hay garantía de que este control será el hijo directo de la página, y yo no (por lo que yo sé!), Tienen la capacidad para determinar dónde en mi controla esta ID, excepto al buscar desde la página hacia abajo.

Lo único que puedo pensar es mantener una tabla de búsqueda de cada objeto en la página, pero parece una idea equivocada.

¿Alguien más ha experimentado este problema?

+0

Tiene usted considera o mirado en ViewState? – Joe

+0

Esperando encontrar una solución que sea compatible con MVC Framework. Voy a intentar hacer la transición de este proyecto a ese después de esta última refactorización. Tengo entendido que ViewState no es compatible con MVC. ¿Es aceptable pensar en mi ASP.NET Page.FindControl como el método ViewPage.FindControl? ¿Experimentaré la misma lentitud? –

Respuesta

2

Hrm, ¿qué tal esto ... El HtmlElementID debería ser la identificación del cliente del control que debería ser la ubicación totalmente calificada del control.

Algo como esto:

Page_Parent_0_Control_1

Se podría romper la cadena de ID y luego navegar desde la página hacia abajo para el control en cuestión juntando la ruta al mismo.

Página FindControl Page_Parent (índice # 0) Page_Parent_0 FindControl Page_Parent_0_Control (índice # 1)

Aún no

la mejor manera pero le ahorraría de hacer una búsqueda escopeta para el control en cuestión.

Esperamos que esto va a funcionar para usted o por lo menos darle otra forma de ver el problema :)

+0

Eso definitivamente es algo a considerar. Dejaré esto abierto por un tiempo, pero si no aparece nada, analizaré los beneficios de la solución propuesta. –