none
Error extraño de referencia de objeto RRS feed

  • Pregunta

  • Hola:

    Me creo unos controles dinámicamente en dos páginas aspx

    Una

                    For intj = 1 To intcolumnas
                        tbl2 = New Table
                        intnumero = (inti - 1) * 3 + intj
                        tr2 = New TableRow
                        tc2 = New TableCell
                        lit = New Literal
                        tc2.Controls.Add(lit)
                        lit.Text = "<b>" & intnumero & ". "
                        loc = New Localize
                        tc2.Controls.Add(loc)
                        loc.Text = "Título"
                        tr2.Cells.Add(tc2)
                        txt = New TextBox
                        tc2.Controls.Add(txt)
                        txt.ID = "txtque" & intnumero
                        txt.MaxLength = 25
                        txt.ReadOnly = True
                        tr2.Cells.Add(tc2)
                        tbl2.Rows.Add(tr2)
                        tr2 = New TableRow
                        tc2 = New TableCell
                        lit = New Literal
                        lit.Text = "<b>"
                        tc2.Controls.Add(lit)
                        loc = New Localize
                        tc2.Controls.Add(loc)
                        If blncatalogos Then
                            loc.Text = "Foto:"
                        Else
                            loc.Text = "Fichero:"
                        End If
                        tr2.Cells.Add(tc2)
                        tr2 = New TableRow
                        lit = New Literal
                        lit.Text = "</b>"
                        tc2.Controls.Add(lit)
                        lbl = New Label
                        lbl.ID = "lblfichero" & intnumero
                        tc2.Controls.Add(lbl)
                        tr2.Cells.Add(tc2)
                        tbl2.Rows.Add(tr2)
                        tr2 = New TableRow
                        tc2 = New TableCell
                        loc = New Localize
                        lit = New Literal
                        tc2.Controls.Add(lit)
                        lit.Text = "<b>"
                        loc.Text = strobra
                        tc2.Controls.Add(loc)
                        lit = New Literal
                        tc2.Controls.Add(lit)
                        lit.Text = "<br />"
                        txt = New TextBox
                        tc2.Controls.Add(txt)
                        txt.ID = "txtdescripcion" & intnumero
                        txt.TextMode = TextBoxMode.MultiLine
                        txt.Rows = 10
                        txt.Columns = 30
                        txt.ReadOnly = True
                        tr2.Cells.Add(tc2)
                        tbl2.Rows.Add(tr2)
                        tc.Controls.Add(tbl2)
                        tr.Cells.Add(tc)
                    Next
    


    Si pregunto por el control lblfichero1 me sale el error 

    Referencia a objeto no establecida como instancia de un objeto.


    Dos

                    For intj = 1 To intcolumnas
                        tc = New TableCell
                        tbl2 = New Table
                        intnumero = (inti - 1) * 3 + intj
                        tr2 = New TableRow
                        tc2 = New TableCell
                        lit = New Literal
                        tc2.Controls.Add(lit)
                        lit.Text = "<b>" & intnumero & ". "
                        lbl = New Label
                        tc2.Controls.Add(lbl)
                        lbl.Text = "* "
                        lbl.ForeColor = Drawing.Color.Red
                        loc = New Localize
                        tc2.Controls.Add(loc)
                        loc.Text = GetGlobalResourceObject("rgeneral", "titulo")
                        tr2.Cells.Add(tc2)
                        tc2 = New TableCell
                        txt = New TextBox
                        tc2.Controls.Add(txt)
                        txt.ID = "txtque" & intnumero
                        txt.MaxLength = 25
                        rfv = New RequiredFieldValidator
                        tc2.Controls.Add(rfv)
                        rfv.ValidationGroup = "publicar"
                        rfv.Display = ValidatorDisplay.None
                        rfv.ControlToValidate = "txtque" & intnumero
                        rfv.ErrorMessage = loc.Text & " " & intnumero & " " & GetGlobalResourceObject("rgeneral", "obligatorio")
                        rev = New RegularExpressionValidator
                        tc2.Controls.Add(rev)
                        rev.Display = ValidatorDisplay.None
                        rev.ValidationGroup = "publicar"
                        rev.ControlToValidate = "txtque" & intnumero
                        rev.ValidationExpression = "[^'<>]*"
                        rev.ErrorMessage = IIf(intidioma <> 2, loc.Text & " " & intnumero & " " & GetGlobalResourceObject("rgeneral", "invalido"), UCase(Left(GetGlobalResourceObject("rgeneral", "invalido"), 1)) & Mid(GetGlobalResourceObject("rgeneral", "invalido"), 2) & " " & LCase(loc.Text) & " " & intnumero)
                        tr2.Cells.Add(tc2)
                        tbl2.Rows.Add(tr2)
                        tr2 = New TableRow
                        tc2 = New TableCell
                        lit = New Literal
                        tc2.Controls.Add(lit)
                        lit.Text = "<b>"
                        If intnumero > intnpublicaciones_anterior Then
                            lbl = New Label
                            tc2.Controls.Add(lbl)
                            lbl.Text = "* "
                            lbl.ForeColor = Drawing.Color.Red
                        End If
                        loc = New Localize
                        tc2.Controls.Add(loc)
                        If blncatalogos Then
                            loc.Text = GetGlobalResourceObject("rgeneral", "foto")
                        Else
                            loc.Text = GetGlobalResourceObject("rgeneral", "fichero")
                        End If
                        tc2.VerticalAlign = VerticalAlign.Top
                        tr2.Cells.Add(tc2)
                        tc2 = New TableCell
                        fu = New FileUpload
                        tc2.Controls.Add(fu)
                        fu.ID = "fufichero" & intnumero
                        tr2.Controls.Add(tc2)
                        If intnumero > intnpublicaciones_anterior Then
                            rfv = New RequiredFieldValidator
                            tc2.Controls.Add(rfv)
                            rfv.ValidationGroup = "publicar"
                            rfv.Display = ValidatorDisplay.None
                            rfv.ControlToValidate = "fufichero" & intnumero
                            rfv.ErrorMessage = loc.Text & " " & intnumero & " " & IIf(blncatalogos, GetGlobalResourceObject("rgeneral", "obligatoria"), GetGlobalResourceObject("rgeneral", "obligatorio"))
                        End If
                        If intnumero <= intnpublicaciones_anterior Then
                            lit = New Literal
                            tc2.Controls.Add(lit)
                            lit.Text = "<br />"
                            lbl = New Label
                            lbl.ID = "lblfichero" & intnumero
                            tc2.Controls.Add(lbl)
                        ElseIf intj <> 1 AndAlso intnumero <= Math.Ceiling(intnpublicaciones_anterior / 3) * 3 Then
                            tr2.Cells.Add(tc2)
                            tbl2.Rows.Add(tr2)
                            tr2 = New TableRow
                            tc2 = New TableCell
                            lit = New Literal
                            tc2.Controls.Add(lit)
                            lit.Text = "&nbsp;"
                        End If
                        rev = New RegularExpressionValidator
                        tc2.Controls.Add(rev)
                        rev.Display = ValidatorDisplay.None
                        rev.ValidationGroup = "publicar"
                        rev.ControlToValidate = "fufichero" & intnumero
                        rev.ValidationExpression = "[^'<>(]*"
                        rev.ErrorMessage = IIf(intidioma <> 2, loc.Text & " " & intnumero & " " & IIf(obra = 1 OrElse obra = 4 OrElse obra = 12, GetGlobalResourceObject("rgeneral", "invalida"), GetGlobalResourceObject("rgeneral", "invalido")), UCase(Left(GetGlobalResourceObject("rgeneral", "invalida"), 1)) & Mid(GetGlobalResourceObject("rgeneral", "invalida"), 2) & " " & LCase(loc.Text) & " " & intnumero)
                        tr2.Cells.Add(tc2)
                        tbl2.Rows.Add(tr2)
                        tr2 = New TableRow
                        tc2 = New TableCell
                        lit = New Literal
                        tc2.Controls.Add(lit)
                        lit.Text = "<b>"
                        tc2.ColumnSpan = 2
                        tc2.HorizontalAlign = HorizontalAlign.Center
                        lbl = New Label
                        tc2.Controls.Add(lbl)
                        lbl.Text = "* "
                        lbl.ForeColor = Drawing.Color.Red
                        loc = New Localize
                        tc2.Controls.Add(loc)
                        loc.Text = IIf(intidioma = 1, IIf(obra = 2, "Aplicación", IIf(obra = 4, "Canción", IIf(obra = 9, "Documental", strobra))), strobra)
                        lit = New Literal
                        tc2.Controls.Add(lit)
                        lit.Text = "<br />"
                        txt = New TextBox
                        tc2.Controls.Add(txt)
                        txt.ID = "txtdescripcion" & intnumero
                        txt.TextMode = TextBoxMode.MultiLine
                        txt.Rows = 10
                        txt.Columns = 30
                        rfv = New RequiredFieldValidator
                        tc2.Controls.Add(rfv)
                        rfv.Display = ValidatorDisplay.None
                        rfv.ValidationGroup = "publicar"
                        rfv.ControlToValidate = "txtdescripcion" & intnumero
                        rfv.ErrorMessage = loc.Text & " " & intnumero & " " & IIf(obra = 2 OrElse obra = 8 OrElse obra = 12, GetGlobalResourceObject("rgeneral", "obligatoria"), GetGlobalResourceObject("rgeneral", "obligatorio"))
                        rev = New RegularExpressionValidator
                        tc2.Controls.Add(rev)
                        rev.Display = ValidatorDisplay.None
                        rev.ValidationGroup = "publicar"
                        rev.ControlToValidate = "txtdescripcion" & intnumero
                        rev.ValidationExpression = "[^'<>]*"
                        rev.ErrorMessage = IIf(intidioma <> 2, loc.Text & " " & intnumero & " " & IIf(obra = 2 OrElse obra = 8 OrElse obra = 12, GetGlobalResourceObject("rgeneral", "invalida"), GetGlobalResourceObject("rgeneral", "invalido")), UCase(Left(GetGlobalResourceObject("rgeneral", "invalida"), 1)) & Mid(GetGlobalResourceObject("rgeneral", "invalida"), 2) & " " & LCase(loc.Text) & " " & intnumero)
                        tr2.Cells.Add(tc2)
                        tbl2.Rows.Add(tr2)
                        tc.Controls.Add(tbl2)
                        tr.Cells.Add(tc)
                    Next
    

    Si pregunto por lblfichero1 sí lo referencia.

    ¿Cuál es la diferencia?

    Gracias de antemano

    jueves, 27 de agosto de 2015 17:28

Respuestas

  • [Caso 1]
    Si pregunto por el control lblfichero1 me sale el error
     Referencia a objeto no establecida como instancia de un objeto.
    [Caso2]
    Si pregunto por lblfichero1 sí lo referencia.
     
    ¿Cuál es la diferencia?

    Información insuficiente.

    Puesto que se trata de un control definido dinámicamente, en ninguno de los casos puedes preguntar directamente por él desde el fuente compilado, a no ser que en uno de los dos exista ya en diseño el lblFichero1, cosa que explicaría la diferencia.

    Así pues, cuando dices que "preguntas por lblfichero1", cabe suponer que lo buscas mediante un FindControl o instrucción similar. Dado que el FindControl se aplica sobre un contenedor, puede ser que en uno de los casos estés usando un contenedor que sí que contiene el control generado dinámicamente y en el otro caso no.

    Otra razón para la discrepancia podría ser que en un caso la búsqueda la hagas desde una rutina que se ejecuta antes de haber generado el control dinámico, y en el otro la hagas después, lo cual también explicaría la diferencia entre un caso y otro.

    Otra razón podría ser que la variable intcolumnas en un caso valga cero y en el otro no.

    Como puedes ver, hay muchas razones para que se produzca una diferencia entre los dos casos (seguro que hay más además de estas que se me han ocurrido a bote pronto). Estas razones no son evidentes a la vista del código presentado, dependen de otros factores que aquí no se aprecian.

    • Marcado como respuesta volar.2014 jueves, 27 de agosto de 2015 20:37
    jueves, 27 de agosto de 2015 17:44

Todas las respuestas

  • [Caso 1]
    Si pregunto por el control lblfichero1 me sale el error
     Referencia a objeto no establecida como instancia de un objeto.
    [Caso2]
    Si pregunto por lblfichero1 sí lo referencia.
     
    ¿Cuál es la diferencia?

    Información insuficiente.

    Puesto que se trata de un control definido dinámicamente, en ninguno de los casos puedes preguntar directamente por él desde el fuente compilado, a no ser que en uno de los dos exista ya en diseño el lblFichero1, cosa que explicaría la diferencia.

    Así pues, cuando dices que "preguntas por lblfichero1", cabe suponer que lo buscas mediante un FindControl o instrucción similar. Dado que el FindControl se aplica sobre un contenedor, puede ser que en uno de los casos estés usando un contenedor que sí que contiene el control generado dinámicamente y en el otro caso no.

    Otra razón para la discrepancia podría ser que en un caso la búsqueda la hagas desde una rutina que se ejecuta antes de haber generado el control dinámico, y en el otro la hagas después, lo cual también explicaría la diferencia entre un caso y otro.

    Otra razón podría ser que la variable intcolumnas en un caso valga cero y en el otro no.

    Como puedes ver, hay muchas razones para que se produzca una diferencia entre los dos casos (seguro que hay más además de estas que se me han ocurrido a bote pronto). Estas razones no son evidentes a la vista del código presentado, dependen de otros factores que aquí no se aprecian.

    • Marcado como respuesta volar.2014 jueves, 27 de agosto de 2015 20:37
    jueves, 27 de agosto de 2015 17:44
  • Hola:

    Gracias, Alberto.

    Hago un redirect a otra página. Allí pregunto por el lblfichero con un findcontrol, por lo que yo aplico de lo que dices

    'Así pues, cuando dices que "preguntas por lblfichero1", cabe suponer que lo buscas mediante un FindControl o instrucción similar. Dado que el FindControl se aplica sobre un contenedor, puede ser que en uno de los casos estés usando un contenedor que sí que contiene el control generado dinámicamente y en el otro caso no.'

    ¿Cómo sé el contenedor? La verdad es que no entiendo muy bien eso. Todos los controles están en una tabla. Las dos páginas aspx generan parecido html. Si hace falta más información te la doy

    ¿Me podrías decir más claro?

    Gracias de nuevo



    • Editado volar.2014 jueves, 27 de agosto de 2015 18:27
    jueves, 27 de agosto de 2015 18:24
  • ¿Cómo sé el contenedor?

    Es lo que escribes a la izquierda del FindControl, por ejemplo, si haces Panel1.FindControl("loquesea") entonces Panel1 es el contenedor en cuyo interior estás buscando el control "loquesea".

    Si no pones nada, y dices directamente FindControl("loquesea"), se entiende Me.FindControl("loquesea"), con lo que se hace la búsqueda sobre el propio Form. Alguna que otra vez me he encontrado con la sorpresa de que esta búsqueda sobre el Form falla y no encuentra el control, nunca he averiguado por qué. Lo suelo solucionar añadiendo algún contenedor, como por ejemplo un Panel, si es que no existe ya en la página algún control adecuado tal como una tabla, o escribiendo una rutina recursiva que recorra la colección de controles, en lugar de usar el FindControl.

    jueves, 27 de agosto de 2015 20:05