none
Modificar datos de una lista RRS feed

  • Pregunta

  • Hola

    Trabajo en Windows Forms, Visual Studio 2019, Sql Server 2014 Express Edition

    Tengo un formulario de ventas en el cual selecciono un producto y lo agrego a una lista(en memoria) y lo enlazo a un DataGridView.

    El caso particular que tengo es el siguiente: en el negocio el cliente cuando vende un producto le hace el descuento a la hora de hacer la venta como se presente la ocasión sin respetar el precio de lista. Si en la lista el precio de venta al publico pvp es 8.50 pero el cliente dice me deja a 8.00 y lo llevo, entonces en el form venta debe permitir hacer el descuento.

    Lo comencé hacer de la siguiente manera le ingreso el descuento por un form en la grilla.

    Al momento que resto el precio menos el descuento y regresa al foreach donde me comprueba donde hago la modificación me da error.

    nuevoPrecio = entity.Precio - entity.TotalDescuento;
                    //entity.Precio = nuevoPrecio;
                    if (iva > 0)
                    {
    
                        if (producto.IncluyeImpuesto == IncluyeImpuestoType.No)
                        {
                            //El SubTotalIva recibe el valor del importe, la propiedad importe solo es una propiedad de solo
                            //Lectura para hacer el calculo de cantidad * precio.
    
                            entity.SubTotalIva = importe;
                            entity.ValorIva = entity.SubTotalIva * tasaIva;
                        }
                        if (producto.IncluyeImpuesto == IncluyeImpuestoType.Si)
                        {
                            if (entity.TotalDescuento == 0)
                            {
                                entity.SubTotalIva = importe;
                                entity.SubTotalIva = Math.Round(importe * 10000M / (100M + iva)) / 100M;
                                entity.ValorIva = entity.Importe - entity.SubTotalIva;
                            }
                            if (entity.TotalDescuento > 0)
                            {
                                entity.SubTotalIva = nuevoPrecio;
                                entity.SubTotalIva = Math.Round(nuevoPrecio * 10000M / (100M + iva)) / 100M;
                                entity.ValorIva = entity.Importe - entity.SubTotalIva;
                            }

    Foreach

    private void OnDescuentoSelected(SelectedCantidad obj)
            {
                if (!string.IsNullOrEmpty(obj.Valor))
                {
                    _saDetalleOrdenVenta.Clean();
                    DetalleOrdenVentaExtend entity = null;
                    foreach (var buscado in _listVenta) ==> Lanza excepción.
                    {
                        if (buscado.ProductoId == _productId)
                        {
                            buscado.TotalDescuento = Convert.ToDecimal(obj.Valor);
                        }
                        entity = new DetalleOrdenVentaExtend()
                        {
                            ProductoPrecioId = buscado.ProductoPrecioId,
                            ProductoId = buscado.ProductoId,
                            Descripcion = buscado.Descripcion,
                            Cantidad = buscado.Cantidad,
                            Precio = buscado.Precio,
                            TotalDescuento = buscado.TotalDescuento
                        };
                        _saDetalleOrdenVenta.Agregar(entity);
                        _listVenta.Clear();
                        dgvVenta.DataSource = null;
                        _listVenta = _saDetalleOrdenVenta.MostrarVentas();
                        txtSubTotalIVA.Text = $"{entity.SumSubTotalIva:N2}";
                        txtIVA.Text = $"{entity.SumValorIva:N2}";
                        txtSubTotalIVACero.Text = $"{entity.SumSubtotalIvaCero:N2}";
                        txtTotal.Text = $"{entity.SumTotal:N2}";
                        lblTotalVenta.Text = $"{txtTotal.Text:N2}";
                        txtDescuento.Text = $"{entity.SumaTotalDescuento:N2}";
    
                        dgvVenta.AutoGenerateColumns = false;
                        dgvVenta.DataSource = _listVenta;
                    }
                }
            }

    Cuando regresa al ForEach es donde me da este mensaje: Colección modificada; puede que no se ejecute la operación de enumeración.

    Con esta clase trabajo la venta, donde manejo el precio, cantidad, descuento y los demás datos que aparecen en el detalle del form venta.

    public class DetalleOrdenVentaExtend
        {
            private decimal importe { get; set; }
            public int DetalleOrdenVentaId { get; set; }
            //public string Folio { get; set; }
            public int OrdenVentaId { get; set; }
            public int ProductoPrecioId { get; set; }
            public int ProductoId { get; set; }
            public string Descripcion { get; set; }
    
            public decimal Cantidad { get; set; }
            public decimal Precio { get; set; }
            public decimal SubTotalIva { get; set; }
    
            public decimal Importe => importe = Cantidad * Precio;
    
            public decimal SubTotalCero { get; set; }
            public decimal SubTotalNoObjetoIva { get; set; }
            public decimal SubTotalExentoIva { get; set; }
            public decimal SubTotal { get; set; }
            public decimal TotalDescuento { get; set; }
            public decimal ValorIce { get; set; }
            public decimal ValorIrbpnr { get; set; }
            public decimal ValorIva { get; set; }
    
            public decimal SumSubTotalIva { get; set; }
            public decimal SumValorIva { get; set; }
            public decimal SumSubtotalIvaCero { get; set; }
            public decimal SumTotal { get; set; }
            public decimal SumaTotalDescuento { get; set; }
        }

      

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    jueves, 4 de julio de 2019 18:08

Respuestas

  • Estas modificando la colección dentro del mismo For Each:
    foreach (var buscado in _listVenta)
    {
    ...
    _listVenta.Clear(); // estas modificando la colección original
    _listVenta = _saDetalleOrdenVenta.MostrarVentas();// estas modificando la colección original
    ...
    }
    Una opción es usar: foreach (var buscado in _listVenta.ToList()) ó .ToArray()
    Ya hay otros ejemplos en el foro.

    https://social.msdn.microsoft.com/Forums/es-ES/23ec147c-a846-43b0-9cf6-81e7a7f34fa4/coleccin-modificada-puede-que-no-se-ejecute-la-operacin-de-enumeracin?forum=vcses

    Saludos.

    • Marcado como respuesta Pedro Ávila jueves, 4 de julio de 2019 19:41
    jueves, 4 de julio de 2019 18:45