none
Sumar Cantidad con el mismo codigo RRS feed

  • Pregunta

  • Hola a todo el foro tengo la siguiente pregunta 

    tengo una form (frmfacturacion) donde tengo un DGV donde se van agregando todos los codigos que yo digito lo que quiero hacer es cuando ingrese un codigo que ya e agragado antes no se me agrege como una linea nuevo si no que me sume nada mas a la cantidad de la linea que ya existe el en DGV

    CODIGO      CANTIDAD     DESCRIPCION     P. UNITARIO     IMPORTE

    000001             1             PRODUCTO 1         $50.00       $50.00

    000002             3             PRODUCTO 2         $20.00       $60.00

    000003             1             PRODUCTO 3         $10.00       $10.00

    en vez de:

    000001             1             PRODUCTO 1        $50.00       $50.00

    000002             1             PRODUCTO 2         $20.00       $20.00

    000003             1             PRODUCTO 3         $10.00       $10.00

    000002             1             PRODUCTO 2         $20.00       $20.00

    000002             1             PRODUCTO 2         $20.00       $20.00


    lunes, 20 de julio de 2015 20:40

Respuestas

  • hola

    no te animas a usar linq para localizar la row con el codigo

    podrias hacer

    string codigo = txtCodigo.Text;
    
    int cantidad = Convert.ToInt32(txtCantidad.Text);
    
    DataGridViewRow row = DataGridView1.Rows.Cast<DataGridViewRow>().FirstOrDefault(x=> Convert.ToString(x.Cells["CODIGO"].Value) == codigo);
    
    if(row != null){
    
       int rowCant= Convert.ToInt32(row.Cells["CANTIDAD"].Value);
    
       row.Cells["CANTIDAD"].Value = rowCant + cantidad;
    
    } else {
    
       //creas una nueva row
    
    }

    como veras linq hace la vida mas simple


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 21 de julio de 2015 1:45

Todas las respuestas

  • Hola Formulador,

    ¿El ingreso de datos lo haces a través de objetos textbox? Si ese es el caso, lo que debes de hacer es recorrer el DGV y en caso encuentres una coincidencia con el código ingresado acumulas el valor de las celdas.

    foreach DataGridViewRow row in DataGridView1.rows
    {
      if (txtCodigo.text == Convert.ToString(row.cells["Codigo"].Value))
      {
        row.cells["punitario"].value = row.cells["punitario"].value + txtPrecioUnitario.text;
        /*demás valores acumulados*/
      }
      {
        /*insertas nueva fila*/
      }
    }

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    lunes, 20 de julio de 2015 20:51
  • el ingreso lo hago en el mismo DGV pero tambien tengo un textbox opcional 

    ese codigo es para c#?

    lunes, 20 de julio de 2015 20:56
  • yo tengo un codigo en .NET no se si te sirva

    esta un poco rebuscado

    For f As Integer = 0 To DataGridView1.RowCount - 1
                    If DataGridView1.Item(0, f).Value <> Nothing Then 'si hay algo escrito en la celda del codigo
                        If DataGridView1.Item(0, f).Value = clave.Text Then'si la clave ya existe
                            If DataGridView1.Item(1, f).Value <> Nothing Then'si hay algo escrito en la celda cantidad
                                If IsNumeric(DataGridView1(1, f).Value) Then'si es un numero
                                    DataGridView1.ClearSelection()'quito seleccion a todas las celdas
                                    DataGridView1.Rows.Item(f).Selected = True'selecciono la fila que contiene el codigo existente
                                    DataGridView1.Item(1, f).Value = Val(DataGridView1.Item(1, f).Value) + 1'hago el incremento a la celda de cantidad
                                    f = DataGridView1.RowCount - 1'finalizo el ciclo for
                                Else'si no es un numero
                                   DataGridView1.ClearSelection()'quito la seleccion a todas las celdas
                                    DataGridView1.Rows.Item(f).Selected = True'selecciono la fila que se repite
                                    f = DataGridView1.RowCount - 1'finalizo el ciclo for
                                End If
                            Else'si no hay nada escrito en la celda cantidad
                                DataGridView1.ClearSelection()'limpio la seleccion
                                DataGridView1.Rows.Item(f).Selected = True'selecciono la fila que se repite
                                DataGridView1.Item(1, f).Value = 1'pongo un 1 en la celda de cantidad
                                f = DataGridView1.RowCount - 1'termino ciclo for
                            End If
                        End If
                    Else'si el codigo aun no existe
                        DataGridView1.Rows.Add()'añado una fila
                        DataGridView1.ClearSelection()'limpio seleccion
                        DataGridView1.Rows.Item(f).Selected = True'selecciono la nueva fila
                        DataGridView1.Item(0, f).Value = clave.Text'agrego el nuevo codigo a su respectiva celda
                        DataGridView1.Item(1, f).Value = 1'le agrego el numero 1 a la celda cantidad de la nueva fila
                        f = DataGridView1.RowCount - 1'finalizo ciclo for
                    End If
                Next
    el evento lo puedes hacer en el EndEdit de tu DTGV verificando si la columna que se termino de editar fue la del codigo (if datagridview1.currentcell.columnindex = 0 then)


    • Editado RHCRD lunes, 20 de julio de 2015 22:53
    lunes, 20 de julio de 2015 22:46
  • hola

    no te animas a usar linq para localizar la row con el codigo

    podrias hacer

    string codigo = txtCodigo.Text;
    
    int cantidad = Convert.ToInt32(txtCantidad.Text);
    
    DataGridViewRow row = DataGridView1.Rows.Cast<DataGridViewRow>().FirstOrDefault(x=> Convert.ToString(x.Cells["CODIGO"].Value) == codigo);
    
    if(row != null){
    
       int rowCant= Convert.ToInt32(row.Cells["CANTIDAD"].Value);
    
       row.Cells["CANTIDAD"].Value = rowCant + cantidad;
    
    } else {
    
       //creas una nueva row
    
    }

    como veras linq hace la vida mas simple


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 21 de julio de 2015 1:45
  • >>el ingreso lo hago en el mismo DGV pero tambien tengo un textbox opcional

    aconsejaria que los datos que ingreses los realicen en controles fuera del grid, asi puedes controlar de forma mas simple si debes crear una nueva row o trabjar con una existente

    si ya trabajas en una una row sera mas complejo luego definir la logica para quitarla


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 21 de julio de 2015 1:47
  • Buen Día 

    buscando me encontre con este consejo, estoy desarroyando un pequeño proyecto de caja de cobro y tengo este mismo problema, poder aumentar la cantidad de un producto si el codigo de producto ya registrado es el mismo que ya se encuentra en el DataGridView.

    tu codigo como funciona.

    espero me puedas apoyar.

    martes, 26 de julio de 2016 21:26