servidor net lado eventos dinamicamente crear controles asp asp.net user-controls placeholder-control

lado - crear controles dinamicamente asp.net c#



Captura de eventos desde controles de usuario ASP.NET agregados dinĂ¡micamente (6)

Tengo un formulario web ASP.NET al que agrego un número variable de controles de usuario. Tengo dos problemas:

  1. Los User Controls se agregan a un PlaceHolder en el formulario en el primer evento PageLoad (solo los agrego cuando "(! This.IsPostback)", pero luego cuando se vuelve a publicar el formulario, los controles desaparecen. ¿Es esto normal? otros controles en el formulario mantienen su estado, espero que estos dinámicamente agregados permanezcan en el formulario también. ¿Debo agregarlos para cada devolución?

  2. También tengo un botón y un controlador de eventos para el evento de clic de botón, pero este controlador de eventos nunca se llama cuando hago clic en el botón. ¿Hay algo especial que deba hacer para detectar eventos en controles agregados dinámicamente?


  1. Sí, debe agregarlos en cada devolución.
  2. Sí ... el control debe estar en la jerarquía de control antes de que asp.net distribuya el evento (es decir, cree los controles dinámicos lo antes posible en el ciclo de vida de la página).

1) Debe agregar los controles en el preinicio ( ciclo de vida de la página )

2) Debe adjuntar el controlador de eventos al evento del botón creado (los eventos pueden ocurrir mucho más tarde en el ciclo de vida de la página que los mismos eventos para los controles creados declarativamente).


  1. Para lograr esto, agregue sus controles al inicio de página en lugar de cargar la página. (volver a agregar en la devolución de datos)
  2. Deberá conocer la identificación de los botones agregados para vincularlos al evento.

Me encontré con un problema similar. Tenía una página que mostraba una colección de controles web personalizados. Mi solución fue agregar un control web invisible adicional para que cuando haga clic en un botón para agregar otro control simplemente use el invisible. Luego, en la publicación posterior, mi función de carga agregaría otro control invisible a la colección.


Ayer descubrí que puedes hacer que tu aplicación funcione como siempre cargando el árbol de control justo después de que se active el evento loadviewstatevent. Si anula el evento loadviewstate, llame a mybase.loadviewstate y luego coloque su propio código para regenerar los controles inmediatamente después, los valores para esos controles estarán disponibles en la carga de la página. En una de mis aplicaciones utilizo un campo viewstate para contener la ID o la información de la matriz que se puede usar para recrear esos controles.

Protected Overrides Sub LoadViewState(ByVal savedState As Object) MyBase.LoadViewState(savedState) If IsPostBack Then CreateMyControls() End If End Sub


Me encontré con el mismo problema y pasé entre 5 y 6 horas. Estoy publicando esto, tal vez alguien como yo podría obtener ayuda.

1) Debe inicializar sus controles en el evento Page.PreInit. (En mi caso, tuve que agregar mis controles a un marcador de posición, así que extendí PreInit para cargar esos controles antes, pero no es necesario que lo haga. Depende de su situación).

2) Debería unir esos métodos exactos a sus controles después de inicializarlos en su evento Page.PreInit.

Aquí está mi código de muestra:

protected override void OnPreInit(EventArgs e) { // Loading controls... this.PrepareChildControlsDuringPreInit(); // Getting ddl container from session and creating them... if (GetDDLSession().Count != 0) { foreach (DropDownList ddl in GetDDLSession()) { ddl.SelectedIndexChanged += SelectedIndexChanged; phDropDowns.Controls.Add(ddl); } } base.OnPreInit(e); } public static void PrepareChildControlsDuringPreInit(this Page page) { // Walk up the master page chain and tickle the getter on each one MasterPage master = page.Master; while (master != null) master = master.Master; }