none
Acceso a Controles Dinamicos RRS feed

  • Pregunta

  • Buenas, necesito una vez mas de su ayuda.

    Tengo un lista de tipo

         List<Tuple<string, string, string>> listacampos = new List<Tuple<string, string, string >>();

    Esta lista se rellena con los siguientes valores no siempre son 4 elementos

        listacampos.add("A", "PrimerCampo", "10");
        listacampos.Add("A", "SegundoCampo", "11");
        listacampos.Add("B", "TercerCampo", "12"); 
        listacampos.Add("B", "CuartoCampo", "11");

     Para poder llevar estos valores a una pagina Web se generan los campos de la lista dinámicamente, ya que no sabemos el numero de ellos que habrá de la siguiente forma.

    private void CrearCamposDinamicos()

    {

    for (int i = 0; i < listacampos.Count; i++)

    { string tipocampo = listacampos[i].Item1; string identcampo = listacampos[i].Item2; string textocampo = listacampos[i].Item3; HiddenField hfc = new HiddenField(); hfc.ID = "HO_" + tipocampo + "_" + identcampo; hfc.Value = "SinValor"; EM_OcultoS.Controls.Add(hfc); }

    }

    Posteriormente a esto ( ya en la pagina ) una función JavaScript se encarga de Cambiar el valor de estos Campos según el usuario vaya seleccionando unos valores.

    El caso es que cuando intento recoger esos valores desde el código C# de nuevo, todos los valores me aparecen de nuevo  en "SinValor" sin embargo si inspecciono el código de la pagina los valores en los campos están correctamente modificados lo que me confirma que la función JS funciona correctamente y el fallo esta en el CodeBehind.

    Los valores los intento recoger de la siguiente forma 

      

    protected void recogervalores(){

    for (int i=0; i < listacampos.Count; i++) { HiddenField elemento = (HiddenField)EM_OcultoS.FindControl("HO_" + listacampos[i].Item1 + "_" + listacampos[i].Item2); Debug.WriteLine(" Item de Tipo " + listacampos[i].Item1 + " cuyo valor es " + elemento.Text); }

    }

    He probado a cambiar estos elementos a un campo texto en vez de un hidden por di ese fuera el problema pero me pasa lo mismo, no se ve los cambios en los valores.

    Por otra parte estoy llamando a esta función CrearCamposDinamicos() desde el Page_Load porque sino ni siquiera encontraría los elementos ( los elementos los encuentra pero siempre con valor por defecto ) porque los ha vuelto a crear entiendo.

    ¿ Alguna Idea ?

    lunes, 7 de mayo de 2018 14:23

Todas las respuestas

  • Una sugerencia sencilla: En lugar de leer los valores con FindControl, simlemente recupéralos desde la colección Request.Form. Ahí siempre te llegan todos los input que haya en la página en el momento de hacer el Submit, con independencia de cuándo crees los controles en el ciclo de vida de la página (que probablemente es la razón por la que no te funciona -- se puede resolver cambiando del Page_Load al Page_Init, pero no es necesario si usas el Request.Form).
    lunes, 7 de mayo de 2018 16:11
  • La forma correcta de utilizar controles dinámicos es agregarlos en cada postback.  ¿Hace usted esto?

    Jose R. MCP
    Code Samples

    lunes, 7 de mayo de 2018 16:19
    Moderador
  •  Creo que si, en el Page_Load como decía siempre se llama a la función que crea los controles, de hecho el find me localiza el control perfectamente, el problema es que me lo esta dejando con el valor con el que se crea y no con el que estableció el usuario.

    Voy a investigar lo del Request.Form a ver si puedo llamar a esa función y su estrcutura.

    Gracias

    lunes, 7 de mayo de 2018 16:33
  • Si el Request.Form revela que los valores son consistentes con su actual método, le recomiendo revisar el JavaScript que setea los valores.

    Jose R. MCP
    Code Samples

    lunes, 7 de mayo de 2018 16:35
    Moderador
  • hola

    >>Posteriormente a esto ( ya en la pagina ) una función JavaScript se encarga de Cambiar el valor de estos Campos según el usuario vaya seleccionando unos valores.

    pero si vas a usar esto desde javascript porque no usaste un json, eso de crear hidden dinamicos es horrible

    si pones un solo hidden con los datoa serializadoa a json despues podras trabjarlos directo en javascript, sera aun mas facil si usas jquery

    no geners controles dinamicos es para problemas, que el hidden sera uno solo y contenga un json con la info

    Adema no uses Tuple, crea una clase con propiedades

    public class Dato{
    
        public string tipo {get;set;}
        public string ident {get;set;}
        public string texto{get;set;}
    
    }

    entonces seria

    List<Dato> listacampos = new List<Dato>();

    eso se puede serializar a json facilmente con la libreria json.net

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 7 de mayo de 2018 16:45
  • Estoy mirando acceder a través del Request.Form["elemento"]; , pero el nombre de este elemento no es el que le he asignado yo, sino que me aparece como nombre ctl00$Contenido$elemento.

    ¿ Es asi como tengo que acceder a estos elementos ? en este caso, es verdad que no necesito recrear los elementos pero el valor que me esta dando es vacio y no el valor que creo que debería de tener.

    Para comprobar este valor lo estoy poniendo en un Alert("") antes de enviar llamar al codebehind y ahí si se ve correctamente el valor por lo que entiendo que el problema la sigo teniendo en el CodeBehind y no en las funciones JS que establecen los valores de estos elementos.

    Si puedo aportar algún tipo de código mas no duden en pedírmelo, es muy importante para mi poder resolver este tema.

    Muchas Gracias

    lunes, 7 de mayo de 2018 16:52
  • Estoy mirando acceder a través del Request.Form["elemento"]; , pero el nombre de este elemento no es el que le he asignado yo, sino que me aparece como nombre ctl00$Contenido$elemento.

    ¿ Es asi como tengo que acceder a estos elementos ? en este caso, es verdad que no necesito recrear los elementos pero el valor que me esta dando es vacio y no el valor que creo que debería de tener.

    Para comprobar este valor lo estoy poniendo en un Alert("") antes de enviar llamar al codebehind y ahí si se ve correctamente el valor por lo que entiendo que el problema la sigo teniendo en el CodeBehind y no en las funciones JS que establecen los valores de estos elementos.

    Si puedo aportar algún tipo de código mas no duden en pedírmelo, es muy importante para mi poder resolver este tema.

    Muchas Gracias

    Sí, es probable que ese sea el nombre.  Para verificar basta con examinar el HTML generado en Google Chrome o similar.

    Como le dije en mi respuesta anterior, si los valores están vacíos, es porque el JavaScript que setea los valores probablemente esté fallando.  Puesto que lo veo sorprendido con el nombre del campo, tal vez sea un problema de ID's incorrectos.


    Jose R. MCP
    Code Samples

    lunes, 7 de mayo de 2018 17:16
    Moderador
  • [...] entiendo que el problema la sigo teniendo en el CodeBehind y no en las funciones JS [...]

    Lo mejor es salir cuanto antes de esta duda, para no perder el tiempo mirando en uno de los dos lados cuando el problema está en el otro. Para ello, se pulsa la F12 en el navegador y se hace una captura de red. Examinando el Body de la petición http enviada desde el navegador al servidor, se ve fácilmente el detalle de cómo se llama cada campo transmitido al servidor y cuáles son los valores que se están transmitiendo. Ahí se ve con claridad si van vacíos o tienen valores.
    martes, 8 de mayo de 2018 5:59
  •  Gracias por vuestra ayuda, ya he conseguido que me de el valor correcto recogiendo el parámetro como ctl00$Contenido$elemento, por lo que creo que se puede dar por cerrada la consulta.

      En cualquier caso, me ha parecido que la opción de usar json para realizar este tipo de tareas es muy interesante tal y como indicaba Leandro, aunque nunca lo he usado parece un buen momento para hacerlo, supongo que el comportamiento de serializar una lista de objetos será parecido a serializar un único objeto.

     Muchas gracias de nuevo a todos por su atención.


    martes, 8 de mayo de 2018 9:12