Acceder a controles generados dinámicamente Referencia de objeto no establecida en una instancia de un objeto

Estoy agregando controles dinámicamente a mi página sobre la base de una condición. Hay un botón en estos controles, al que también he adjuntado un controlador de eventos para el evento de clic. Ahora, en este controlador de eventos, estoy tratando de acceder a mi controles, pero obteniendo una excepción. Aquí está mi código:

protected void Page_Load(object sender, EventArgs e)
        {
            String Method = Request.QueryString["Method"];
            String Tag = Request.QueryString["Tag"];


            if (Method=="ADD" && Tag=="METHOD")
            {

                //6
            TableCell cell11 = new TableCell();
            cell11.Text = "NEXTLEVEL";

            TableCell cell12 = new TableCell();
            TextBox txt6 = new TextBox();
            txt6.ID = "txt6";
            cell12.Controls.Add(txt6);

            TableRow row6 = new TableRow();
            row6.Cells.Add(cell11);
            row6.Cells.Add(cell12);

            container.Rows.Add(row6);
                TableCell cell14 = new TableCell();
                Button submit = new Button();
                submit.ID = "SubmitButton";
                submit.Text = "Submit";
                submit.Click += new EventHandler(submit_Click);

                cell14.Controls.Add(submit);

                TableRow row7 = new TableRow();

                row7.Cells.Add(cell14);

                container.Rows.Add(row7);
            }

void submit_Click(object sender, EventArgs e)
        {
            ModifySessionAnalyzer msa = new ModifySessionAnalyzer();
            TextBox txt6= (TextBox)Page.FindControl("txt6") as TextBox;
            ##String message = txt6.Text;##

        }

preguntado el 03 de mayo de 12 a las 11:05

No puedes acceder txt6? ¿Dónde se declara el cuadro de texto con este ID? -

He actualizado mi código. Puedo acceder a txt6 ahora en el controlador de eventos submit_click. -

2 Respuestas

TableCell cell12 = new TableCell();
TextBox txt6 = new TextBox();
txt6.ID = "txt6";
cell12.Controls.Add(new TextBox());

Esto está mal, no está agregando el control txt6 a la celda, sino que está agregando un nuevo cuadro de texto...

contestado el 03 de mayo de 12 a las 11:05

Sí, lo descubrí y también modifiqué el código. Ahora puedo acceder a los controles dinámicos. Estoy confundido con una declaración aquí dada por CrabBucket, diciendo que escribiría mi código generado dinámicamente en Page_Init en lugar de Page_load, no entendí esto. ¿Por qué debería hacer esto? - Charu

Porque cuando crea los controles en PageLoad, pierde los valores definidos por el usuario cuando ocurre un PostBack. Una buena práctica es crear los controles en PageInit y cargar los valores que necesita que tengan en PageLoad. Cuando tiene una devolución de datos, los controles se vuelven a crear en PageInit y luego .NET carga los datos de ViewState en los controles. Sin embargo, creo que esto ya no es un problema a partir de .NET 4. ¿Aceptarás mi respuesta entonces? :) - Dante

@Dante. ¿Tiene un enlace/referencia para el problema de creación de control dinámico PageInit/PageLoad que no es un problema en .Net 4. Solo interesado. Gracias - Cubo de cangrejo

Realmente no. En alguna otra pregunta de stackoverflow sobre el mismo tema, se mencionó que esto ya no era un problema, pero no lo confirmé yo mismo. - Dante

Los controles agregados dinámicamente deben agregarse en el Page_Init método no Page_Load. Si se agregan en Page_Load no se agregarán al árbol de control y obtendrá problemas, es decir, no participarán correctamente en ViewState.

So (TextBox)Page.FindControl("txt6") podría fallar ya que el cuadro de texto ya no está en el árbol de control

Esta podría ser la fuente de su problema.

Explicación adicional

Tu código debe ser

protected void Page_Init(object sender, EventArgs e)
{
      //.. your code goes here
}

NO

protected void Page_Load(object sender, EventArgs e)
{
   //.. your code
}

Es una práctica normal usar Page_Load por lo tanto, es solo un hábito fácil para las personas, pero cuando se usan controles dinámicos, esta es la excepción

Cuando digo controles dinámicos, es cualquier cosa cuando se agregan controles sobre la marcha en lugar de declararlos en su página. Busca cualquier cosa a donde vas Controls.Add

contestado el 03 de mayo de 12 a las 12:05

He actualizado el código, capaz de acceder a los controles generados dinámicamente. ¿No entendí tu punto de agregarlos a page_init? ¿Puedes arrojar algo más de luz? - Charu

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.