update net asp asp.net web-user-controls

asp.net - update mysql asp net c#



Controles añadidos dinámicamente en Asp.Net (9)

Ah, ese es el problema con la abstracción filtrada de los formularios web ASP.NET.

¿Tal vez le interese mirar ASP.NET MVC, que se usó para la creación de este sitio web stackoverflow.com? Eso debería ser más fácil para usted, viniendo de un fondo PHP (por lo tanto, pedaleando hacia el metal cuando se trata de HTML y Javascript).

Estoy tratando de entender a asp.net. Tengo experiencia como desarrollador de PHP desde hace mucho tiempo, pero ahora estoy enfrentando la tarea de aprender asp.net y estoy teniendo problemas con eso. Bien podría ser porque estoy tratando de forzar el marco en algo para lo que no está destinado, así que me gustaría aprender cómo hacerlo "de la manera correcta". :-)

Mi problema es cómo agregar controles a una página mediante programación en tiempo de ejecución. Por lo que puedo deducir, necesitas crear los controles en page_init, ya que de lo contrario desaparecerían en la próxima publicación de PostBack. Pero muchas veces me enfrento al problema de que no sé qué controles agregar en page_init ya que depende de los valores de PostBack anterior.

Un escenario simple podría ser un formulario con un control desplegable agregado en el diseñador. El menú desplegable está configurado en AutoPostBack. Cuando se produce el PostBack, necesito renderizar uno o más controles denegando el valor seleccionado del control desplegable y preferiblemente hacer que esos controles actúen como si hubieran sido añadidos por el diseño (como en "cuando se publiquen, se comporten" correctamente).

¿Estoy yendo por el camino equivocado aquí?


Bien. Si puede dejar de crear controles dinámicamente, hágalo; de lo contrario, lo que debería hacer es usar Page_Load en vez de Page_Init, pero en lugar de colocar cosas dentro de If Not IsPostBack, entonces configuro solo directamente en el método.


Creo que la respuesta aquí está en el control MultiView , de modo que, por ejemplo, el menú desplegable cambia entre diferentes vistas en la vista múltiple.

¡Es probable que incluso pueda vincular datos a la propiedad de vista actual de la vista múltiple con el valor del menú desplegable!


Debe agregar su control dentro del evento OnInit y se conservará viewstate. No use if (ispostback), porque los controles deben agregarse cada vez, evento en la devolución de datos.
(De) La serialización de viewstate ocurre después de OnInit y antes de OnLoad, por lo que su proveedor de persistencia de viewstate verá los controles agregados dinámicamente si se agregan en OnInit.

Pero en el escenario que está describiendo, probablemente una mejor solución sea la vista múltiple o simple ocultar / mostrar (propiedad visible).
Es porque en el evento OnInit, cuando debe leer el menú desplegable y agregar nuevos controles, viewstate aún no se lee (deserializa) y usted no sabe qué eligió el usuario. (puede hacer request.form (), pero eso se siente un poco mal)


Si realmente necesita usar controles dinámicos, lo siguiente debería funcionar:

  • En OnInit, recree exactamente la misma jerarquía de control que estaba en la página cuando se cumplió la solicitud anterior. (Si esta no es la solicitud inicial, por supuesto)
  • Después de OnInit, el marco cargará viewstate desde la solicitud anterior y todos sus controles deberían estar en un estado estable ahora.
  • En OnLoad, elimine los controles que no son necesarios y agregue los necesarios. También deberá guardar de alguna manera el árbol de control actual en este punto, para usarlo en el primer paso durante la siguiente solicitud. Puede usar una variable de sesión que dicte cómo se creó el árbol de control dinámico. Incluso almacené toda la colección Controls en la sesión una vez ( dejé de lado tus horcas, fue solo para una demostración ).

Volver a agregar los controles "obsoletos" que no necesitará y que se eliminarán en OnLoad de todos modos parece un tanto peculiar, pero Asp.Net en realidad no se diseñó pensando en la creación de controles dinámicos. Si la misma jerarquía de control no se conserva durante la carga del estado de visualización, en la página acechan todo tipo de errores difíciles de encontrar, porque los estados de los controles anteriores se cargan en los recién agregados.

Lea el ciclo de vida de la página de Asp.Net y especialmente sobre cómo funciona viewstate y será más claro.

Editar: Este es un muy buen artículo sobre cómo se comporta ViewState y lo que debe considerar al tratar con controles dinámicos: http://geekswithblogs.net/FrostRed/archive/2007/02/17/106547.aspx


La única respuesta correcta fue dada por Aydsman. LoadViewState es el único lugar para agregar controles dinámicos donde sus valores de viewstate se restaurarán cuando se vuelva a crear y podrá acceder al viewstate para determinar qué controles agregar.


Me encontré con esto en el libro "Pro ASP.NET 3.5 en C # 2008" en la sección Creación de Control Dinámico:

Si necesita volver a crear un control varias veces, debe realizar la creación del control en el controlador de eventos Page.Load. Esto tiene la ventaja adicional de permitirle usar el estado de vista con su control dinámico. Aunque el estado de visualización normalmente se restaura antes del evento Page.Load, si crea un control en el controlador para el evento Page.Load, ASP.NET aplicará cualquier información de estado de vista que tenga una vez que finalice el controlador de eventos Page.Load. Este proceso es automático.

No he probado esto, pero podrías investigarlo.


Después de haber luchado con este problema por un tiempo, he encontrado estas reglas básicas que parecen funcionar, pero YMMV.

  • Use controles declarativos siempre que sea posible
  • Use databinding cuando sea posible
  • Comprenda cómo funciona ViewState
  • La propiedad Visibilty puede recorrer un largo camino
  • Si debe usar los controles de agregar en un controlador de eventos, use la sugerencia de Aydsman y vuelva a crear los controles en un LoadViewState reemplazado.

VERDADERO Entender ViewState es una lectura obligada.

La comprensión de los controles dinámicos por ejemplo muestra algunas técnicas sobre cómo usar enlace de datos en lugar de controles dinámicos.

VERDADERAMENTE La comprensión de los controles dinámicos también aclara las técnicas que se pueden usar para evitar controles dinámicos.

Espero que esto ayude a otros con los mismos problemas.


Estoy de acuerdo con los otros puntos hechos aquí "Si puedes dejar de crear controles dinámicamente, hazlo ..." (por @Jesper Blad Jenson alias ) pero aquí hay un truco que desarrollé con controles creados dinámicamente en el pasado.

El problema se convierte en pollo y huevo. Necesita su ViewState para crear el árbol de control y necesita su árbol de control creado para llegar a su ViewState. Bueno, eso es casi correcto. Hay una forma de obtener los valores de su ViewState justo antes de que se rellene el resto del árbol. Eso es anulando LoadViewState(...) y SaveViewState(...) .

En SaveViewState, almacene el control que desea crear:

protected override object SaveViewState() { object[] myState = new object[2]; myState[0] = base.SaveViewState(); myState[1] = controlPickerDropDown.SelectedValue; return myState }

Cuando el marco llame a su anulación "LoadViewState", obtendrá el objeto exacto que devolvió de "SaveViewState":

protected override void LoadViewState(object savedState) { object[] myState = (object[])savedState; // Here is the trick, use the value you saved here to create your control tree. CreateControlBasedOnDropDownValue(myState[1]); // Call the base method to ensure everything works correctly. base.LoadViewState(myState[0]); }

Lo utilicé con éxito para crear páginas ASP.Net donde un DataSet se serializó en ViewState para almacenar los cambios en una grilla de datos completa que permite al usuario realizar múltiples ediciones con PostBacks y finalmente comprometer todos sus cambios en un solo "Guardar" operación.