none
como puedo sumar solo columnas de un DataGridView que estén seleccionados con un checkbox

    Pregunta

  • Ayuda como puedo Sumar solo columnas de un DataGridView que estén seleccionados con un checkbox en un resultado y las que no estén seleccionadas en otro resultado.

    Gracias de antemano 

    • Editado Willian61x viernes, 30 de septiembre de 2016 2:07
    viernes, 30 de septiembre de 2016 1:49

Respuestas

  • Hola Willian61x,

    Te dejo un ejemplo sencillo :

    Dim suma As Double = DataGridView1.Rows.OfType(Of DataGridViewRow).
                           Where(Function(x) x.Cells("ColumnaCheckBox").Value = True).
                           Sum(Function(x) CDbl(x.Cells("ColumnaASumar").Value))
    
    MessageBox.Show("Suma seleccionados : " & suma.ToString)

    Solo tendrías que cambiar el nombre de la columna o usar la posición.

    Dim suma As Double = DataGridView1.Rows.OfType(Of DataGridViewRow).
                                 Where(Function(x) x.Cells(0).Value = True).
                                 Sum(Function(x) CDbl(x.Cells(1).Value))

    Dónde la columna 1 (posición 0), columna 2 (posición 1), etc..

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 30 de septiembre de 2016 2:16
  • Willian61x,

    Si deseas obtener la sumatoria de elementos agrupados lo mejor será hacer lo mismo: agrupar y sumar, la recomendación es leer una sola vez el origen:

    Dim data = DataGridView1.Rows.Cast(Of DataGridViewRow)().
    		GroupBy(Function(x) Convert.ToBoolean(x.Cells("ColCheck").Value)).
    		[Select](Function(x) New With {
    		        Key .Check = x.Key,
    			Key .Suma = x.Sum(Function(y) Convert.ToDecimal(y.Cells("ColCantidad").Value))
    		}).ToList()
    
    MessageBox.Show(String.Format("Activos {0}, Inactivos {1}",
    		data.FirstOrDefault(Function(x) x.Check = True).Suma,
    		data.FirstOrDefault(Function(x) x.Check = False).Suma))


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de septiembre de 2016 3:18
  • Incluso (dejando de lado la linq-manía jeje), con sólo recorrer las filas de la grilla de datos y acumular cantidades basta y además el código queda mas simple y legible:

    Dim sumaActivos As Integer = 0
    Dim sumaInactivos As Integer = 0
    
    For Each row As DataGridViewRow In DataGridView1.Rows
    	If Convert.ToBoolean(row.Cells("ColumnaCheck").Value) Then
    		sumaActivos += Convert.ToDecimal(row.Cells("Cantidad").Value)
    	Else
    		sumaInactivos += Convert.ToDecimal(row.Cells("Cantidad").Value)
    	End If
    Next



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de septiembre de 2016 4:13
  • Amigo disculpa q te moleste el ejemplo esta excelente si me valió pero tambien quiero sacar el resultado de los q no están seleccionados disculpa otra ves a molestia

    Hola Willian61x,

    Puedes obtenerlo mediante la diferencia :

    Dim seleccionados As Double = DataGridView1.Rows.OfType(Of DataGridViewRow).
                           Where(Function(x) x.Cells("ColumnaCheckBox").Value = True).
                           Sum(Function(x) CDbl(x.Cells("ColumnaASumar").Value))
    
    Dim no As Double = (DataGridView1.Rows.OfType(Of DataGridViewRow).
                         Sum(Function(x) CDbl(x.Cells("ColumnaASumar").Value))) - seleccionados

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 30 de septiembre de 2016 2:46

Todas las respuestas

  • Hola Willian61x,

    [-] ... como puedo Sumar solo columnas de un DataGridView que estén seleccionados con un checkbox

    Sumar las columnas, no serán las filas ?

    Puedes mostrar una imagen de tu DataGridView ?

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 30 de septiembre de 2016 2:07
  • Buenas noches amigo no me deja subir imágenes si quise subirla para q me ayuden  

    mas o menos va asi

    Cantidad    l          Descripción        l      Valor Unitario   l   valor  total  l   Descuento   l  "Checkbox" l

    5                       Cuaderno 1.00   5.00               10 seleccionar


    • Editado Willian61x viernes, 30 de septiembre de 2016 2:13
    viernes, 30 de septiembre de 2016 2:12
  • Hola Willian61x,

    Te dejo un ejemplo sencillo :

    Dim suma As Double = DataGridView1.Rows.OfType(Of DataGridViewRow).
                           Where(Function(x) x.Cells("ColumnaCheckBox").Value = True).
                           Sum(Function(x) CDbl(x.Cells("ColumnaASumar").Value))
    
    MessageBox.Show("Suma seleccionados : " & suma.ToString)

    Solo tendrías que cambiar el nombre de la columna o usar la posición.

    Dim suma As Double = DataGridView1.Rows.OfType(Of DataGridViewRow).
                                 Where(Function(x) x.Cells(0).Value = True).
                                 Sum(Function(x) CDbl(x.Cells(1).Value))

    Dónde la columna 1 (posición 0), columna 2 (posición 1), etc..

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 30 de septiembre de 2016 2:16
  • Voy aprobar Gracias amigo me salvaste

    viernes, 30 de septiembre de 2016 2:17
  • Amigo disculpa q te moleste el ejemplo esta excelente si me valió pero tambien quiero sacar el resultado de los q no están seleccionados disculpa otra ves a molestia

    viernes, 30 de septiembre de 2016 2:33
  • si fue lo primero que hice pero me sale error en el where. lo que quiero sacar los dos resultados uno con los seleccionados y el otro los que no están seleccionados

    viernes, 30 de septiembre de 2016 2:46
  • Amigo disculpa q te moleste el ejemplo esta excelente si me valió pero tambien quiero sacar el resultado de los q no están seleccionados disculpa otra ves a molestia

    Hola Willian61x,

    Puedes obtenerlo mediante la diferencia :

    Dim seleccionados As Double = DataGridView1.Rows.OfType(Of DataGridViewRow).
                           Where(Function(x) x.Cells("ColumnaCheckBox").Value = True).
                           Sum(Function(x) CDbl(x.Cells("ColumnaASumar").Value))
    
    Dim no As Double = (DataGridView1.Rows.OfType(Of DataGridViewRow).
                         Sum(Function(x) CDbl(x.Cells("ColumnaASumar").Value))) - seleccionados

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 30 de septiembre de 2016 2:46
  • Muchas gracias amigo 
    viernes, 30 de septiembre de 2016 3:07
  • Willian61x,

    Si deseas obtener la sumatoria de elementos agrupados lo mejor será hacer lo mismo: agrupar y sumar, la recomendación es leer una sola vez el origen:

    Dim data = DataGridView1.Rows.Cast(Of DataGridViewRow)().
    		GroupBy(Function(x) Convert.ToBoolean(x.Cells("ColCheck").Value)).
    		[Select](Function(x) New With {
    		        Key .Check = x.Key,
    			Key .Suma = x.Sum(Function(y) Convert.ToDecimal(y.Cells("ColCantidad").Value))
    		}).ToList()
    
    MessageBox.Show(String.Format("Activos {0}, Inactivos {1}",
    		data.FirstOrDefault(Function(x) x.Check = True).Suma,
    		data.FirstOrDefault(Function(x) x.Check = False).Suma))


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de septiembre de 2016 3:18
  • Incluso (dejando de lado la linq-manía jeje), con sólo recorrer las filas de la grilla de datos y acumular cantidades basta y además el código queda mas simple y legible:

    Dim sumaActivos As Integer = 0
    Dim sumaInactivos As Integer = 0
    
    For Each row As DataGridViewRow In DataGridView1.Rows
    	If Convert.ToBoolean(row.Cells("ColumnaCheck").Value) Then
    		sumaActivos += Convert.ToDecimal(row.Cells("Cantidad").Value)
    	Else
    		sumaInactivos += Convert.ToDecimal(row.Cells("Cantidad").Value)
    	End If
    Next



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 30 de septiembre de 2016 4:13
  • Gracias me das otra posibilidad para hacer mi proyecto esta muy bien amigo

    viernes, 30 de septiembre de 2016 18:22
  • Gracias amigo muy buena tu respuesta
    viernes, 30 de septiembre de 2016 18:23