none
Problema con arreglos y variables static RRS feed

  • Pregunta

  • Buenos dias. Les comento el problema que tengo, estoy desarrollando un sistema en el cual tengo que crear un formulario donde se muestren tareas dinamicamente y cada una de esas tareas debe tener 2 radioButton. Todo esto en funcion del producto seleccionado, el cual tiene un esquema de tareas asociado y esta todo guardado en la BD.

    El tema es que cuando voy a armar el formulario hago lo siguiente:

        public partial class ChequeoEtapa2 : System.Web.UI.Page
        {
            static Label[] arregloTareas;
            static RadioButton[] arregloRBOK;
            static RadioButton[] arregloRBFalla;

      protected void Page_Load(object sender, EventArgs e)
            {
                string flag = "0";
                if (!Page.IsPostBack)
                {

                    arregloTareas = new Label[CantidadTareasProducto];
                    arregloRBOK = new RadioButton[CantidadTareasProducto];
                    arregloRBFalla = new RadioButton[CantidadTareasProducto];

    //CantidaddeTareasProducto me devuelve un int con la cant de tareas del producto seleccionado.

    }

    y luego estos controles los uso en otros Metodos para armarelEsquema, y obtener los valores del radioButton


    El problema es que yo declaro como Static los arreglos y tengo problemas cuando 2 usuarios están en el mismo formulario ya que el Static "comparte" las variables, entonces si son 2 productos distintos con esquemas distintos aparecen los problemas

    Yo sé que se pueden utilizar las variables Session pero no se como hacerlo con un arreglo como este.

    Alguien me puede dar una mano con este tema? Le di muchas vueltas pero nose como encararlo

    Muchas Gracias


    MarianoRN

    jueves, 4 de enero de 2018 15:00

Respuestas

  • Te pongo un ejemplo de como hacer una de ellas con el Session. Con la otra harías algo parecido.

    private RadioButton[] arregloRBOK
    {
        get
        {
             return Session["rba"] as RadioButton[];
        }
        set
        {
             Session["rba"] = value;
        }
    }
    

    Ojo, la clase RadioButton no es serializable, por lo que esto solo funcionará si el modo de sesión es InProc. Si alguna vez lo cambias a algún otro modo que requiera serializar la sesión, se producirán errores. En ese caso, tendrías que guardar en el session las propiedades de cada radiobutton, y no el propio radiobutton.

    jueves, 4 de enero de 2018 15:14
    Moderador
  • hola

    Qn un desarrollo web no definas nunca variables con static porque estas se compoartaran como el objeto Application y su valor sera accesible a nivel del sitio y no del usuario

    >>Yo sé que se pueden utilizar las variables Session pero no se como hacerlo con un arreglo como este.

    porque necesitas mantener un array de controles,eso no deberia ser necesario, podrias aplicar linq para buscar el control directo sobre la colecion de Controls de la pagina

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 4 de enero de 2018 16:00
  • hola

    la verdad es que no entiendo porque un codigo tan complicado, cuando quieres armar algo dinamico se usan template, como ser con el control Repeater o ListView

    entonces defines un template con los controles y al asignar un datasource se crearan tantos de estos bloques como datos tengas

    crear controles dinamicos como lo realizas alli no esta bien

    ademas no se usa array se usa List<>

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 4 de enero de 2018 18:08
  • hola

    Qn un desarrollo web no definas nunca variables con static porque estas se compoartaran como el objeto Application y su valor sera accesible a nivel del sitio y no del usuario

    >>Yo sé que se pueden utilizar las variables Session pero no se como hacerlo con un arreglo como este.

    porque necesitas mantener un array de controles,eso no deberia ser necesario, podrias aplicar linq para buscar el control directo sobre la colecion de Controls de la pagina

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Hola Leandro, de que forma podria utiliza LinQ? yo lo que hago es lo siguiente; creo los Arrays, luego tengo que verificar si se ingresa por primera vez o si tiene valores cargados los RadioButtons y luego recupero los valores de los radiobutton y los guardo en un string... te puedo mostrar el codigo que tengo:


    namespace SistemaGestionAthenea.TestCalidad
    {
        public partial class ChequeoEtapa2 : System.Web.UI.Page
        {
            static Label[] arregloTareas;
            static RadioButton[] arregloRBOK;
            static RadioButton[] arregloRBFalla;


            protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                    LblIDProd.Text = Request.QueryString["LblIDProd"];
                    LblIDTest.Text = Request.QueryString["LbIdTest"];



                    arregloTareas = new Label[(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false))];
                    arregloRBOK = new RadioButton[EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false))];
                    arregloRBFalla = new RadioButton[(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false))];
                }
                try
                {
                    for (int i = 0; i < contadorControles; i++)
                        AgregarControles(arregloTareas[i], arregloRBOK[i], arregloRBFalla[i]);

                }
                catch (Exception ex)
                {
                    LbValidacion.Text = ex.Message;
                }

                if (!IsPostBack)
                {
                    ArmarFormulario();
                    cargarRespuestas();

                }
            }
            private void Registrar()
            {
                ObtenerRespuestas();
                ClasesGenericas.Actualizaciones.GuardarResultadoTest(LblIDTest.Text, LblSerie.Text, respuestas, tareas, 2);
            }

                ObtenerRespuestas();
                LbValidacion.Text = "";            
                
                if (respuestas.Contains("NoChequeado"))
                {
                    LbValidacion.ForeColor = Color.Red;
                    LbValidacion.Text = "Para continuar debe completar todos los chequeos";
                    return;
                }
                else
                {
                    try
                    {
                        StatusNumber.StatusNumberTesteoDeCalidad("3", LblSerie.Text, LblIDTest.Text);
                        Session["StatusNumberActual"] = "3";
                    }
                    catch (Exception ex)
                    {
                        LbValidacion.ForeColor = Color.Red;
                        LbValidacion.Text = ex.Message;
                    }

                    Registrar();
                     Server.Transfer("~/TestCalidad/ChequeoEtapa3.aspx?LbProd=" + LblProd.Text
                          + "&LblIDProd=" + LblIDProd.Text
                          + "&LbSerie=" + LblSerie.Text
                          + "&LbIdTest=" + LblIDTest.Text
                          + "&LbStatusNumber=" + Session["StatusNumberActual"].ToString()
                          + "&Flag_a_primario=1" + "&Componente=" + LbComponente.Text + "&Idresultado=" + Request.QueryString["Idresultado"]);
                }
            }

                Server.Transfer("~/TestCalidad/ChequeoEtapa4.aspx?LbProd=" + LblProd.Text
                          + "&LblIDProd=" + LblIDProd.Text
                          + "&LbSerie=" + LblSerie.Text
                          + "&LbIdTest=" + LblIDTest.Text
                          + "&LbStatusNumber=" + Session["StatusNumberActual"].ToString()
                          + "&Flag_a_primario=1" + "&Componente=" + LbComponente.Text
                          + "&Idresultado=" + Request.QueryString["Idresultado"] + "&cantidadTarea=" + Convert.ToInt16(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false)).ToString());
            }
            public void ArmarFormulario()
            {
                tareas = "";
                int numeroDeTarea = Convert.ToInt16(ClasesGenericas.EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "1",true)) + 1;
                for (int i = 0; i < Convert.ToInt16(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false)); i++)
                {
                    try
                    {
                        int numeroRegistro = contadorControles;


                        Label nuevoLabel = new Label();
                        nuevoLabel.ID = "pregunta" + numeroRegistro.ToString();
                        arregloTareas[numeroRegistro] = nuevoLabel;

                        RadioButton nuevoRBOk = new RadioButton();
                        RadioButton nuevoRBFalla = new RadioButton();

                        arregloRBOK[numeroRegistro] = nuevoRBOk;
                        nuevoRBOk.ID = "rbOK" + numeroRegistro.ToString();

                        arregloRBFalla[numeroRegistro] = nuevoRBFalla;
                        nuevoRBFalla.ID = "rbFalla" + numeroRegistro.ToString();

                        arregloTareas[numeroRegistro].Text = (numeroDeTarea).ToString() + ". " + ClasesGenericas.EsquemaTareasEstandar.ObtenerTareasPorEtapa(LblIDProd.Text, "2")[numeroRegistro] + ": ";

                        arregloRBOK[numeroRegistro].GroupName = "GRB" + (numeroRegistro + 1).ToString();
                        arregloRBFalla[numeroRegistro].GroupName = "GRB" + (numeroRegistro + 1).ToString();

                        arregloRBOK[numeroRegistro].Text = "OK ";
                        arregloRBFalla[numeroRegistro].Text = "Falla";

                        tareas += ClasesGenericas.EsquemaTareasEstandar.ObtenerTareasPorEtapa(LblIDProd.Text, "2")[numeroRegistro] + ";";

                        AgregarControles(nuevoLabel, nuevoRBOk, nuevoRBFalla);

                        numeroDeTarea++;
                        contadorControles++;
                    }
                    catch (Exception ex)
                    {
                        LbValidacion.ForeColor = Color.Red;
                        LbValidacion.Text = ex.Message;
                    }
                }
            } 
            protected void AgregarControles(Label pregunta, RadioButton rbOK, RadioButton rbFalla) 
            {
                try
                {
                    pnlMain.Controls.Add(pregunta);
                    pnlMain.Controls.Add(new LiteralControl(""));
                    pnlMain.Controls.Add(rbOK);
                    pnlMain.Controls.Add(new LiteralControl(""));
                    pnlMain.Controls.Add(rbFalla);
                    pnlMain.Controls.Add(new LiteralControl(""));
                    pnlMain.Controls.Add(new LiteralControl("<br /><br />"));
                }
                catch (Exception ex)
                {
                    LbValidacion.ForeColor = Color.Red;
                    LbValidacion.Text = ex.Message;
                }
            }
            protected void ObtenerRespuestas()
            {
                int numeroRegistro = 0;
                respuestas = "";
                try
                {
                    for (int i = 0; i < Convert.ToInt16(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false)); i++)
                    {
                        if (arregloRBOK[numeroRegistro].Checked == true && arregloRBFalla[numeroRegistro].Checked == false)
                            respuestas += "OK;";

                        else if (arregloRBOK[numeroRegistro].Checked == false && arregloRBFalla[numeroRegistro].Checked == true)
                            respuestas += "FALLA;";

                        else
                            respuestas += "NoChequeado;";
                        numeroRegistro++;
                    }
                }
                catch (Exception ex)
                {
                    LbValidacion.ForeColor = Color.Red;
                    LbValidacion.Text = ex.Message;
                }
            } 
            protected void cargarRespuestas()
            {
                int numeroRegistro = 0;
                respuestas = "";
                try
                {
                    for (int i = 0; i < Convert.ToInt16(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false)); i++)
                    {
                        if (ClasesGenericas.ObtenerData.CargarResultadosTest(LblIDTest.Text, LblSerie.Text, 2)[numeroRegistro] == "OK")
                        {
                            arregloRBOK[numeroRegistro].Checked = true;
                        }
                        if (ClasesGenericas.ObtenerData.CargarResultadosTest(LblIDTest.Text, LblSerie.Text, 2)[numeroRegistro] == "FALLA")
                        {
                            arregloRBFalla[numeroRegistro].Checked = true;
                        }
                        numeroRegistro++;
                    }
                }


    MarianoRN

    jueves, 4 de enero de 2018 17:28
  • hola

    la verdad es que no entiendo porque un codigo tan complicado, cuando quieres armar algo dinamico se usan template, como ser con el control Repeater o ListView

    entonces defines un template con los controles y al asignar un datasource se crearan tantos de estos bloques como datos tengas

    crear controles dinamicos como lo realizas alli no esta bien

    ademas no se usa array se usa List<>

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Leandro no tenia conocimiento de usar template, incluso puedo utilizar RadioButton y obtener sus valores?

    Tienes algun ejemplo donde pueda ver como se hace?

    Gracias!


    MarianoRN

    • Marcado como respuesta Mariano RN jueves, 4 de enero de 2018 22:33
    jueves, 4 de enero de 2018 18:25

Todas las respuestas

  • Te pongo un ejemplo de como hacer una de ellas con el Session. Con la otra harías algo parecido.

    private RadioButton[] arregloRBOK
    {
        get
        {
             return Session["rba"] as RadioButton[];
        }
        set
        {
             Session["rba"] = value;
        }
    }
    

    Ojo, la clase RadioButton no es serializable, por lo que esto solo funcionará si el modo de sesión es InProc. Si alguna vez lo cambias a algún otro modo que requiera serializar la sesión, se producirán errores. En ese caso, tendrías que guardar en el session las propiedades de cada radiobutton, y no el propio radiobutton.

    jueves, 4 de enero de 2018 15:14
    Moderador
  • hola

    Qn un desarrollo web no definas nunca variables con static porque estas se compoartaran como el objeto Application y su valor sera accesible a nivel del sitio y no del usuario

    >>Yo sé que se pueden utilizar las variables Session pero no se como hacerlo con un arreglo como este.

    porque necesitas mantener un array de controles,eso no deberia ser necesario, podrias aplicar linq para buscar el control directo sobre la colecion de Controls de la pagina

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 4 de enero de 2018 16:00
  • hola

    Qn un desarrollo web no definas nunca variables con static porque estas se compoartaran como el objeto Application y su valor sera accesible a nivel del sitio y no del usuario

    >>Yo sé que se pueden utilizar las variables Session pero no se como hacerlo con un arreglo como este.

    porque necesitas mantener un array de controles,eso no deberia ser necesario, podrias aplicar linq para buscar el control directo sobre la colecion de Controls de la pagina

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Hola Leandro, de que forma podria utiliza LinQ? yo lo que hago es lo siguiente; creo los Arrays, luego tengo que verificar si se ingresa por primera vez o si tiene valores cargados los RadioButtons y luego recupero los valores de los radiobutton y los guardo en un string... te puedo mostrar el codigo que tengo:


    namespace SistemaGestionAthenea.TestCalidad
    {
        public partial class ChequeoEtapa2 : System.Web.UI.Page
        {
            static Label[] arregloTareas;
            static RadioButton[] arregloRBOK;
            static RadioButton[] arregloRBFalla;


            protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                    LblIDProd.Text = Request.QueryString["LblIDProd"];
                    LblIDTest.Text = Request.QueryString["LbIdTest"];



                    arregloTareas = new Label[(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false))];
                    arregloRBOK = new RadioButton[EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false))];
                    arregloRBFalla = new RadioButton[(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false))];
                }
                try
                {
                    for (int i = 0; i < contadorControles; i++)
                        AgregarControles(arregloTareas[i], arregloRBOK[i], arregloRBFalla[i]);

                }
                catch (Exception ex)
                {
                    LbValidacion.Text = ex.Message;
                }

                if (!IsPostBack)
                {
                    ArmarFormulario();
                    cargarRespuestas();

                }
            }
            private void Registrar()
            {
                ObtenerRespuestas();
                ClasesGenericas.Actualizaciones.GuardarResultadoTest(LblIDTest.Text, LblSerie.Text, respuestas, tareas, 2);
            }

                ObtenerRespuestas();
                LbValidacion.Text = "";            
                
                if (respuestas.Contains("NoChequeado"))
                {
                    LbValidacion.ForeColor = Color.Red;
                    LbValidacion.Text = "Para continuar debe completar todos los chequeos";
                    return;
                }
                else
                {
                    try
                    {
                        StatusNumber.StatusNumberTesteoDeCalidad("3", LblSerie.Text, LblIDTest.Text);
                        Session["StatusNumberActual"] = "3";
                    }
                    catch (Exception ex)
                    {
                        LbValidacion.ForeColor = Color.Red;
                        LbValidacion.Text = ex.Message;
                    }

                    Registrar();
                     Server.Transfer("~/TestCalidad/ChequeoEtapa3.aspx?LbProd=" + LblProd.Text
                          + "&LblIDProd=" + LblIDProd.Text
                          + "&LbSerie=" + LblSerie.Text
                          + "&LbIdTest=" + LblIDTest.Text
                          + "&LbStatusNumber=" + Session["StatusNumberActual"].ToString()
                          + "&Flag_a_primario=1" + "&Componente=" + LbComponente.Text + "&Idresultado=" + Request.QueryString["Idresultado"]);
                }
            }

                Server.Transfer("~/TestCalidad/ChequeoEtapa4.aspx?LbProd=" + LblProd.Text
                          + "&LblIDProd=" + LblIDProd.Text
                          + "&LbSerie=" + LblSerie.Text
                          + "&LbIdTest=" + LblIDTest.Text
                          + "&LbStatusNumber=" + Session["StatusNumberActual"].ToString()
                          + "&Flag_a_primario=1" + "&Componente=" + LbComponente.Text
                          + "&Idresultado=" + Request.QueryString["Idresultado"] + "&cantidadTarea=" + Convert.ToInt16(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false)).ToString());
            }
            public void ArmarFormulario()
            {
                tareas = "";
                int numeroDeTarea = Convert.ToInt16(ClasesGenericas.EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "1",true)) + 1;
                for (int i = 0; i < Convert.ToInt16(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false)); i++)
                {
                    try
                    {
                        int numeroRegistro = contadorControles;


                        Label nuevoLabel = new Label();
                        nuevoLabel.ID = "pregunta" + numeroRegistro.ToString();
                        arregloTareas[numeroRegistro] = nuevoLabel;

                        RadioButton nuevoRBOk = new RadioButton();
                        RadioButton nuevoRBFalla = new RadioButton();

                        arregloRBOK[numeroRegistro] = nuevoRBOk;
                        nuevoRBOk.ID = "rbOK" + numeroRegistro.ToString();

                        arregloRBFalla[numeroRegistro] = nuevoRBFalla;
                        nuevoRBFalla.ID = "rbFalla" + numeroRegistro.ToString();

                        arregloTareas[numeroRegistro].Text = (numeroDeTarea).ToString() + ". " + ClasesGenericas.EsquemaTareasEstandar.ObtenerTareasPorEtapa(LblIDProd.Text, "2")[numeroRegistro] + ": ";

                        arregloRBOK[numeroRegistro].GroupName = "GRB" + (numeroRegistro + 1).ToString();
                        arregloRBFalla[numeroRegistro].GroupName = "GRB" + (numeroRegistro + 1).ToString();

                        arregloRBOK[numeroRegistro].Text = "OK ";
                        arregloRBFalla[numeroRegistro].Text = "Falla";

                        tareas += ClasesGenericas.EsquemaTareasEstandar.ObtenerTareasPorEtapa(LblIDProd.Text, "2")[numeroRegistro] + ";";

                        AgregarControles(nuevoLabel, nuevoRBOk, nuevoRBFalla);

                        numeroDeTarea++;
                        contadorControles++;
                    }
                    catch (Exception ex)
                    {
                        LbValidacion.ForeColor = Color.Red;
                        LbValidacion.Text = ex.Message;
                    }
                }
            } 
            protected void AgregarControles(Label pregunta, RadioButton rbOK, RadioButton rbFalla) 
            {
                try
                {
                    pnlMain.Controls.Add(pregunta);
                    pnlMain.Controls.Add(new LiteralControl(""));
                    pnlMain.Controls.Add(rbOK);
                    pnlMain.Controls.Add(new LiteralControl(""));
                    pnlMain.Controls.Add(rbFalla);
                    pnlMain.Controls.Add(new LiteralControl(""));
                    pnlMain.Controls.Add(new LiteralControl("<br /><br />"));
                }
                catch (Exception ex)
                {
                    LbValidacion.ForeColor = Color.Red;
                    LbValidacion.Text = ex.Message;
                }
            }
            protected void ObtenerRespuestas()
            {
                int numeroRegistro = 0;
                respuestas = "";
                try
                {
                    for (int i = 0; i < Convert.ToInt16(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false)); i++)
                    {
                        if (arregloRBOK[numeroRegistro].Checked == true && arregloRBFalla[numeroRegistro].Checked == false)
                            respuestas += "OK;";

                        else if (arregloRBOK[numeroRegistro].Checked == false && arregloRBFalla[numeroRegistro].Checked == true)
                            respuestas += "FALLA;";

                        else
                            respuestas += "NoChequeado;";
                        numeroRegistro++;
                    }
                }
                catch (Exception ex)
                {
                    LbValidacion.ForeColor = Color.Red;
                    LbValidacion.Text = ex.Message;
                }
            } 
            protected void cargarRespuestas()
            {
                int numeroRegistro = 0;
                respuestas = "";
                try
                {
                    for (int i = 0; i < Convert.ToInt16(EsquemaTareasEstandar.ObtenerCantidadTareas(LblIDProd.Text, "2", false)); i++)
                    {
                        if (ClasesGenericas.ObtenerData.CargarResultadosTest(LblIDTest.Text, LblSerie.Text, 2)[numeroRegistro] == "OK")
                        {
                            arregloRBOK[numeroRegistro].Checked = true;
                        }
                        if (ClasesGenericas.ObtenerData.CargarResultadosTest(LblIDTest.Text, LblSerie.Text, 2)[numeroRegistro] == "FALLA")
                        {
                            arregloRBFalla[numeroRegistro].Checked = true;
                        }
                        numeroRegistro++;
                    }
                }


    MarianoRN

    jueves, 4 de enero de 2018 17:28
  • hola

    la verdad es que no entiendo porque un codigo tan complicado, cuando quieres armar algo dinamico se usan template, como ser con el control Repeater o ListView

    entonces defines un template con los controles y al asignar un datasource se crearan tantos de estos bloques como datos tengas

    crear controles dinamicos como lo realizas alli no esta bien

    ademas no se usa array se usa List<>

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 4 de enero de 2018 18:08
  • hola

    la verdad es que no entiendo porque un codigo tan complicado, cuando quieres armar algo dinamico se usan template, como ser con el control Repeater o ListView

    entonces defines un template con los controles y al asignar un datasource se crearan tantos de estos bloques como datos tengas

    crear controles dinamicos como lo realizas alli no esta bien

    ademas no se usa array se usa List<>

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Leandro no tenia conocimiento de usar template, incluso puedo utilizar RadioButton y obtener sus valores?

    Tienes algun ejemplo donde pueda ver como se hace?

    Gracias!


    MarianoRN

    • Marcado como respuesta Mariano RN jueves, 4 de enero de 2018 22:33
    jueves, 4 de enero de 2018 18:25