Principales respuestas
Problema con arreglos y variables static

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
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.- Propuesto como respuesta Pablo RubioModerator jueves, 4 de enero de 2018 16:42
- Marcado como respuesta Pablo RubioModerator lunes, 8 de enero de 2018 15:29
-
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- Propuesto como respuesta Pablo RubioModerator jueves, 4 de enero de 2018 16:42
- Marcado como respuesta Pablo RubioModerator lunes, 8 de enero de 2018 15:29
-
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- Propuesto como respuesta Pablo RubioModerator jueves, 4 de enero de 2018 22:15
- Marcado como respuesta Pablo RubioModerator lunes, 8 de enero de 2018 15:30
-
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
ArgentinaHola 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
- Marcado como respuesta Pablo RubioModerator lunes, 8 de enero de 2018 15:29
-
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
ArgentinaLeandro 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
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.- Propuesto como respuesta Pablo RubioModerator jueves, 4 de enero de 2018 16:42
- Marcado como respuesta Pablo RubioModerator lunes, 8 de enero de 2018 15:29
-
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- Propuesto como respuesta Pablo RubioModerator jueves, 4 de enero de 2018 16:42
- Marcado como respuesta Pablo RubioModerator lunes, 8 de enero de 2018 15:29
-
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
ArgentinaHola 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
- Marcado como respuesta Pablo RubioModerator lunes, 8 de enero de 2018 15:29
-
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- Propuesto como respuesta Pablo RubioModerator jueves, 4 de enero de 2018 22:15
- Marcado como respuesta Pablo RubioModerator lunes, 8 de enero de 2018 15:30
-
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
ArgentinaLeandro 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