none
Duplicado de lista en otros equipos RRS feed

  • Pregunta

  • Amigos buenas noches ,  espero me puedan ayudar ,tengo un boton consultar el cual me realiza una consulta a la bd en este tengo un list en la que cargo los datos recibidos de esa consulta , luego este list lo cargo a un gridview desde ese mismo boton  ya q ese fue el requerimiento  esta parte funciona excelente ,resulta  que el usuario1 hace una consulta esta carga muy bien pero si hay varios usuarios haciendo el mismo proceso no solo trae lo que cada usuario consulta si no los datos que consultaron otros usuarios , intente colocando un removelist al final del codigo consultar y me funcionoo pero si quiero cargar mas items me borra los que ya estan en la lista y esto afectaria para las inserciones , como puedo controlar esto para que todos los usuarios trabajen correctamente  comparto mi codigo

            protected void btnBuscar_Click(object sender, EventArgs e)
            {

                string ClientCod = Session["Codigo"].ToString();
                //string CodigoR = CADRemision.CodigoReferencia(drpReferencia.SelectedItem.Text);
                string CodigoR = CADRemision.CodigosPartes(drpReferencia.SelectedItem.Text);

                if (drpReferencia.SelectedValue == "0")
                {
                    ClientScript.RegisterStartupScript(this.GetType(), "Mensaje",
                 "<Script>swal('Mensaje','Debe seleccionar un numero de referencia')</Script>");
                    return;
                }

               

                //consulta que me devuelve  una  registros de sapart y saprod
                try
                {

                

                    DsRemision.BusquedaProdctosDataTable Producto =
                    CADRemision.BusquedaProdctos(CodigoR,
                    ClientCod, drpBodega.SelectedValue);
                    

                    //recorremoremos el objeto producto instancia de BusquedaProdctosDataTable ylos almacenamos en una lista
                    foreach (DataRow row in Producto.Rows)
                    {
                        var Productos = new Productos();



                        Productos.Codigo = row["Codigo"].ToString();
                        Productos.Referencia = row["Referencia"].ToString();
                        Productos.Descrip = row["Descrip"].ToString();
                        Productos.Existen = Convert.ToInt32(row["Existen"].ToString());
                        Productos.Bodega = row["Bodega"].ToString();
                        Productos.Cantidad = Convert.ToDecimal(row["Cantidad"].ToString());
                        Productos.Monto = Convert.ToDecimal(row["Monto"].ToString());
                        Productos.instrumental = Convert.ToDecimal(row["instrumental"].ToString());
                        Productos.ClassID = row["ClassID"].ToString();

                        lista.Add(Productos);
                    }

                    //Session["Producto"] = lista;
                    lbReferencia.Text = CodigoR.ToString();

                }
                catch (Exception)
                {

                    throw;
                }

              
                dgvRemision.DataSource = lista;
                dgvRemision.DataBind();
                lbReferencia.Text = "";


                ClientScript.RegisterStartupScript(this.GetType(), "Mensaje", "<Script>swal" +
                "('Pedido!', 'Consultado  con exito!', 'success')</Script>");
                lista.RemoveAll(i => i.Codigo == i.Codigo);


            }


    Daniel



    • Editado Dannycv012 jueves, 20 de agosto de 2020 0:10
    miércoles, 19 de agosto de 2020 23:56

Respuestas

  • ¿Cómo es la declaración de a variable "lista"? No se ve dentro del código que has mostrado.

    El motivo más probable de que los otros usuarios vean los mismos datos es que la variable esté declarada como "static" y por eso todos ven la misma copia de la variable. Cerciórate de que no tienes variables estáticas, sino que todas son variables de instancia para que se cree una nueva copia por cada usuario.

    Si necesitas preservarlas entre postbacks, almacénalas en el Session (lo tienes entre comentarios). O bien, rediséñalo de manera que no haya que conservarla entre postbacks, sino que se recargue sobre la marcha desde la BD cada vez que necesites volver a aplicar. el DataBind.

    • Marcado como respuesta Dannycv012 jueves, 20 de agosto de 2020 16:12
    jueves, 20 de agosto de 2020 5:44
  •  si le quito el static funciana pero cuando cargo otro item se me borra el que ya estaba en el grid

    Perfecto. Todo concuerda con lo que yo suponia. Cuando lo tienes como "static", es permanente y compartido por todos los usuarios. Por eso todos ven la misma lista, y por eso no se te borra lo que ya estaba en el grid para un usuario.

    Para que no se comparta entre usuarios, es necesario quitar el static.

    Si entonces se te borra para un usuario lo que ya estaba, entonces entra en juego la otra parte donde te dije "Si necesitas preservarlas entre postbacks…". La solucion mas sencilla es salvarlo en el Session. Asegurate de hacerlo bien: guarda la lista cada vez que cambie algo en ella, y recuperala desde el Session antes de leer su contenido. Si lo haces correctamente, funcionara de manera impecable.

    • Marcado como respuesta Dannycv012 jueves, 20 de agosto de 2020 16:12
    jueves, 20 de agosto de 2020 13:31

Todas las respuestas

  • ¿Cómo es la declaración de a variable "lista"? No se ve dentro del código que has mostrado.

    El motivo más probable de que los otros usuarios vean los mismos datos es que la variable esté declarada como "static" y por eso todos ven la misma copia de la variable. Cerciórate de que no tienes variables estáticas, sino que todas son variables de instancia para que se cree una nueva copia por cada usuario.

    Si necesitas preservarlas entre postbacks, almacénalas en el Session (lo tienes entre comentarios). O bien, rediséñalo de manera que no haya que conservarla entre postbacks, sino que se recargue sobre la marcha desde la BD cada vez que necesites volver a aplicar. el DataBind.

    • Marcado como respuesta Dannycv012 jueves, 20 de agosto de 2020 16:12
    jueves, 20 de agosto de 2020 5:44
  • Alberto lo tengo de esta manera  y la seesion la tengo comentariada pensando que era el problema pero la necesito heredar para poder eliminar items de la lista , si le quito el static funciana pero cuando cargo otro item se me borra el que ya estaba en el grid

       public static List<Productos> lista = new List<Productos>();


    Daniel




    • Editado Dannycv012 jueves, 20 de agosto de 2020 12:12
    jueves, 20 de agosto de 2020 11:20
  • Hola Dannycv012, 

      

    Gracias por levantar tu consulta en los foros de MSDN. Vamos a darle seguimiento a tu consulta. 

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN.   

    Eric Ruiz

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    jueves, 20 de agosto de 2020 13:07
    Moderador
  •  si le quito el static funciana pero cuando cargo otro item se me borra el que ya estaba en el grid

    Perfecto. Todo concuerda con lo que yo suponia. Cuando lo tienes como "static", es permanente y compartido por todos los usuarios. Por eso todos ven la misma lista, y por eso no se te borra lo que ya estaba en el grid para un usuario.

    Para que no se comparta entre usuarios, es necesario quitar el static.

    Si entonces se te borra para un usuario lo que ya estaba, entonces entra en juego la otra parte donde te dije "Si necesitas preservarlas entre postbacks…". La solucion mas sencilla es salvarlo en el Session. Asegurate de hacerlo bien: guarda la lista cada vez que cambie algo en ella, y recuperala desde el Session antes de leer su contenido. Si lo haces correctamente, funcionara de manera impecable.

    • Marcado como respuesta Dannycv012 jueves, 20 de agosto de 2020 16:12
    jueves, 20 de agosto de 2020 13:31
  • Alberto muchas gracias funciono correctamente , comparto el codigo por si alguno llega a necesitarlo

        List<Productos> lista = new List<Productos>();
                        if (Session["Producto"]!=null)
                        lista = (List<Productos>)Session["Producto"];
                        lista.Add(Productos);
                        Session["Producto"] = lista;

    hice lo siguente valide que la session tuviera datos almacenados  y asi poder ir agregando cada uno de los items .


    Daniel




    • Editado Dannycv012 jueves, 20 de agosto de 2020 16:13
    jueves, 20 de agosto de 2020 14:14