2011-09-12 11 views
8

pregunta relacionada: Get All Web Controls of a Specific Type on a Page¿Cuándo usar PreRender en PageLoad?

En la pregunta anterior le pregunté cómo puedo conseguir todos los controles, funciona como un encanto pero algo simplemente no encaja así que pensé que podría ser yo. Tengo el siguiente código pero no está manipulando los controles en la página, pero en mi teoría debería funcionar.

List<DropDownList> allControls = new List<DropDownList>(); 
ControlEnhancer.GetControlList<DropDownList>(Page.Controls, allControls); 

foreach (DropDownList childControl in allControls) 
     { 
      foreach (ListItem li in childControl.Items) 
      { 
       li.Attributes.Add("title", li.Text); 
      } 

      childControl.Attributes.Add("onmouseover", "this.title=this.options[this.selectedIndex].title"); 
     } 

Eso es el código, GetControlList() de código que puede obtener de la cuestión relacionada que muestra cómo se pone todos los controles, es sólo mi manipulación. Estoy tratando de obtener todos los elementos de la lista desplegable y agregarles un título para que pueda tener una información sobre herramientas.

Es una solución rápida para IE8 y debajo de los cortes de texto largo en cuadros desplegables.

+0

La pregunta original tiene la lista de controles, esta pregunta necesito para obtener los controles de la lista desplegable y manipularlos como lo estoy intentando arriba al agregar el atributo de texto. – Anicho

+0

Actualización: parece que el problema no está en el código, más en la ubicación, no se está ejecutando hasta que fuerce una devolución de datos en la página, el problema es diferente, aunque la respuesta se publicará en breve. – Anicho

+0

Lo tenía ejecutando en la carga de la página, necesario para ejecutarlo en el evento prerender. – Anicho

Respuesta

8

Page_Load ocurre a menudo demasiado pronto; Page_PreRender es el último momento antes de que el HTML de la página se represente realmente para el navegador y en muchos casos es el mejor lugar para establecer atributos en los controles del usuario.

Esto debido a que durante el ciclo de vida de la forma de internet (página) hay otros eventos en la página (y en los controles de usuario contenidos en la página ...) que a veces extracción/reemplazo/sobreescriben (realmente) esos atributos, de modo que la única forma de obtener esos atributos en el navegador es adjuntarlos después de haber procesado y procesado todos los demás eventos del ciclo de vida, en el Page_PreRender.

+2

Buena respuesta recomendaría que todo el mundo lea: http://msdn.microsoft.com/en-us/library/ms178472.aspx para comprender mejor el ciclo de vida de la página asp.net. – Anicho

+3

"Page_PreRender es el último momento antes de que el HTML de la página se represente realmente" - no es cierto, hay eventos posteriores 'PreRenderComplete' y' SaveStateComplete'. Ver mi respuesta – Joe

8

En realidad, incluso PreRender podría ser demasiado temprano en algunos casos (p. ej. podría tener controles DropDownList agregados al árbol de control durante el enlace de datos de los controles que usan DataSourceID).

Hay dos eventos adicionales que podrían ser más apropiada:

  • PreRenderComplete. En este punto, se crean todos los controles y la página está lista para renderizar.

  • SaveStateComplete. Ocurre después de que se hayan guardado el estado de vista y el estado de control. Cualquier cambio que realice aquí no se mantendrá para ver el estado.

En su ejemplo (añadiendo atributos del lado del cliente), que haría uso del evento SaveStateComplete para evitar la hinchazón innecesaria vista de estado.

+0

Gracias por mejorar activamente la respuesta. Gracias. – Anicho