Principales respuestas
Error extraño de referencia de objeto

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 = " " 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
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
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
-
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
-
¿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.