none
Comportamiento extraño RRS feed

  • Pregunta

  • Hola:

    Me creo unos controles dinámicos en page_init.

    Si referencio dichos controles en la página, me los referencia bien, me da su valor.

    Hago un server.trnsfer.

    En esta segunda página no me referencia bien, no me da los valores.

    ¿A qué puede deberse?

    Gracias de antemano

    viernes, 4 de septiembre de 2015 8:53

Respuestas

  • Hola:

    He daado con una solución temporal. Pasar todos los controles a textbox y referenciarlos con request.form en la página destino. No importa porque se trata de las páginas de administración, que el usuario de internet no lo ve.

    Aun así me quedo con la duda. ¿por qué no da el valor en un caso y en otro sí?

    Gracias.

    • Marcado como respuesta volar.2014 viernes, 4 de septiembre de 2015 17:24
    viernes, 4 de septiembre de 2015 17:24

Todas las respuestas

  • Hola, si estás haciendo algún postback tenés que recrear los controles a mano a partir del ViewState, es un lío importante.

    Mostranos un poco de código a ver qué pasa...

    Cada vez que he necesitado meter controles dinámicos he terminado por encapsular el comportamiento en repeaters dentro de UserControls. Por si te sirve de algo.

    Salu2.

    viernes, 4 de septiembre de 2015 12:05
  • hola

    personalmente no recomendaria que creen controls dinamicos son todo un problema para tomar los datos

    usa controles como ser el Repeater y define un template de controles que se creen dinamicamente segun los datos que asignes

    con los controles dinamicos quizas debas usar el Request.Form para acceder al dato de ese control

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 4 de septiembre de 2015 12:29
  • Hola:

    Gracias, Leandro.

    Este es el código donde creo los controles dinámicos. Los meto dento de tbl30. Tal como dice el MSDN es mejor poner distintos contenedores para distintos tipos de controles. En tbl10 y tbl20 me creo otros controles y me va bien, me referencia bien en la segunda página, la del destino del server.transfer

                tbl10.Visible = False
                tbl20.Visible = False
                tbl30.Visible = True
                For inti = 1 To intfilas
                    If inti * 3 <= intnpublicaciones Then
                        intcolumnas = 3
                    Else
                        intcolumnas = intnpublicaciones - (inti - 1) * 3
                    End If
                    tr = New TableRow
                    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 & ". "
                        loc = New Localize
                        tc2.Controls.Add(loc)
                        loc.Text = "Nombre"
                        tr2.Cells.Add(tc2)
                        txt = New TextBox
                        tc2.Controls.Add(txt)
                        txt.ID = "txtque" & intnumero
                        txt.ReadOnly = True
                        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 intobra = 11 Then
                            loc = New Localize
                            tc2.Controls.Add(loc)
                            loc.Text = "F. inicio"
                            tr2.Cells.Add(tc2)
                            ddl = New DropDownList
                            tc2.Controls.Add(ddl)
                            ddl.ID = "ddldiasfinicio" & intnumero
                            For intz = 1 To 31
                                li = New ListItem(intz)
                                ddl.Items.Add(li)
                            Next
                            ddl = New DropDownList
                            tc2.Controls.Add(ddl)
                            ddl.ID = "ddlmesesfinicio" & intnumero
                            For intz = 1 To 12
                                li = New ListItem(intz)
                                ddl.Items.Add(li)
                            Next
                            ddl = New DropDownList
                            tc2.Controls.Add(ddl)
                            ddl.ID = "ddlanosfinicio" & intnumero
                            For intz = Year(Now) To Year(Now) + 5
                                li = New ListItem(intz)
                                ddl.Items.Add(li)
                            Next
                            tr2.Cells.Add(tc2)
                            tbl2.Rows.Add(tr2)
                            tr2 = New TableRow
                            tc2 = New TableCell
                            lit = New Literal
                            tc2.Controls.Add(lit)
                            lit.Text = "<b>"
                            loc = New Localize
                            tc2.Controls.Add(loc)
                            loc.Text = "F. fin"
                            tr2.Cells.Add(tc2)
                            ddl = New DropDownList
                            tc2.Controls.Add(ddl)
                            ddl.ID = "ddldiasffin" & intnumero
                            For intz = 1 To 31
                                li = New ListItem(intz)
                                ddl.Items.Add(li)
                            Next
                            ddl = New DropDownList
                            tc2.Controls.Add(ddl)
                            ddl.ID = "ddlmesesffin" & intnumero
                            For intz = 1 To 12
                                li = New ListItem(intz)
                                ddl.Items.Add(li)
                            Next
                            ddl = New DropDownList
                            tc2.Controls.Add(ddl)
                            ddl.ID = "ddlanosffin" & intnumero
                            For intz = Year(Now) To Year(Now) + 5
                                li = New ListItem(intz)
                                ddl.Items.Add(li)
                            Next
                            tr2.Cells.Add(tc2)
                            tbl2.Rows.Add(tr2)
                        Else
                            loc = New Localize
                            tc2.Controls.Add(loc)
                            loc.Text = "Fichero: "
                            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)
                        End If
                        tr2 = New TableRow
                        tc2 = New TableCell
                        lit = New Literal
                        tc2.Controls.Add(lit)
                        lit.Text = "<b>"
                        loc = New Localize
                        tc2.Controls.Add(loc)
                        loc.Text = "Importe"
                        tr2.Cells.Add(tc2)
                        txt = New TextBox
                        tc2.Controls.Add(txt)
                        txt.ID = "txtimporte" & intnumero
                        txt.ReadOnly = True
                        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
                        loc = New Localize
                        tc2.Controls.Add(loc)
                        loc.Text = 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
                        txt.ReadOnly = True
                        tr2.Cells.Add(tc2)
                        tbl2.Rows.Add(tr2)
                        tc.Controls.Add(tbl2)
                        tr.Cells.Add(tc)
                    Next
                    tbl30.Rows.Add(tr)
                Next


    Si referencio lblfichero1 en la misma página, me lo reconoce, me da el valor correcto. Ahora si lo pongo en la segunda página, la de destino, me lo reconoce pero no da ningún valor. No sé por qué 

    Gracias de antemano.


    • Editado volar.2014 viernes, 4 de septiembre de 2015 13:07
    viernes, 4 de septiembre de 2015 13:01
  • Hola:

    He daado con una solución temporal. Pasar todos los controles a textbox y referenciarlos con request.form en la página destino. No importa porque se trata de las páginas de administración, que el usuario de internet no lo ve.

    Aun así me quedo con la duda. ¿por qué no da el valor en un caso y en otro sí?

    Gracias.

    • Marcado como respuesta volar.2014 viernes, 4 de septiembre de 2015 17:24
    viernes, 4 de septiembre de 2015 17:24
  • Hola

    La solucion "recomendada" en ASP.NET Webforms para tu procedimiento de "pasar datos a otra pagina" es:

    Bueno pasar datos no es lo correcto sino mas bien "Leer controles de la pagina de origen"! Lo que voy a comentar es para un control y que no es un control dinamico. Para controles dinámicos deberías antes de pasarlo con Server.Transfer. Encapcusarlo en una variable o en un estructura de datos como DIccionario


    Entonces que se debe hacer para "leer" controles (propiedades) de la pagina de origen

    PASO 1: Primeramente en la Pagina de Destino debes tener la directiva de pagima PreviousPageType, asi tiene intellisense con los metodos publicos en la pagina de origen
    Algo asi:

    <%@ PreviousPageType VirtualPath="~/Carpeta1/PaginaOrigen.aspx"%>

    PASO 2: En la pagina de Origen debes "encapsular" los controles que quieres acceder en un metodo
    Pero como son

    public String JediName
    {
        get
        {
            return txtJediName.Text;
        }
    }

    COmo veras es para acceder a controles estaticos. Nunca lo probe con dinamicos.
    SI no funciona te comente mas arriba que deberias tener otras opciones para "resguardar esos datos". incluso una clase misma que sea una variable que seteas y que lo pones como publica para que la pagina de destino lo pueda leer ... Algo oasi

    public Jedi Jedi{ get; private set}
    Y seteas en el origen antes de hacer el transfer el objeto Jedi! (NOTA: Hay que probarlo si funciona, solo es una idea)


    Enlaces que te pueden ayudar

    Espero que te sirva de ayuda o guia


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja

    sábado, 5 de septiembre de 2015 23:04
  • Hola:

    Gracias José.

    He puesto en el aspx destino

    <%@ PreviousPageType VirtualPath="~/Administracion/publicarobras.aspx" %>
    

    En el código de la página origen

        Public ReadOnly Property publicar1() As table
            Get
                Return tblpublicar1
            End Get
        End Property
    

    Pero en intellisense del destino no me reconoce publicar1, la variable pública que paso.

    No sé cómo hacerlo. Los  controles dinámicos de las otras dos tablas los reconoce bien en el destino, sin tener que hace previouspagetype.

    No sé qué me falla

    Gracias de antemano

    domingo, 6 de septiembre de 2015 9:27