none
Sumando Filas Seleccionada en el datagridview RRS feed

  • Pregunta

  • Saludos espero que me pueden ayudar como puedo sumar los precio  en datagridview  no el total es decir si selecciono  leche=$25 y chocalate=$25 que me aparece en el textbox $50

    este es mi codigo  aqui me sumas todos los precios en el datagrid  yo solo quiero sumar lo que yo selecciono  gracias

    Dim total As Double = 0
            For Each fila As DataGridViewRow In DGVProductos.Rows
                If fila.Cells("Precio").Value Is Nothing Then
                    Exit Sub
                Else
                    total += Convert.ToDouble(fila.Cells("Precio").Value)
                End If
    
    

    martes, 1 de diciembre de 2015 8:25

Respuestas

  • Puedes utilizar LINQ:

            Dim total As Double = 0
    
            If DGVProductos.SelectedRows.Count > 0 Then
                total = DGVProductos.SelectedRows.Cast(Of DataGridViewRow) _
                    .Select(Function(r) CType(If(r.Cells("Precio").Value, 0),Decimal)).Sum()
            End If
            textBox1.Text = total.ToString("C")


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 1 de diciembre de 2015 8:36
  • Hola:

     Pero porque no sigues lo que se te indica?

     Te pedi que usaras:

    For Each fila As DataGridViewRow In DGVProductos.SelectedRows
    
                total += Convert.ToDouble(fila.Cells("Precio").Value)
    Next

    De esa manera recorres solo la colección de filas seleccionadas (que desconozco cuantas tengas) y va sumando el valor de la celda de la columna Precio

     Lo mucho que puedes hacer si es que existe la posibilidad de que esta celda no tenga ningún valor es preguntar si el valor contenido es diferente a nulo Nothing en este caso y entonces sumar, pero nunca salirte del ciclo si te topas con una celda en Nothing.

    For Each fila As DataGridViewRow In DGVProductos.SelectedRows
    
    	IF(Not fila.Cells("Precio").Value is Nothing)
    	
    		total += Convert.ToDouble(fila.Cells("Precio").Value)
    	End If
    Next


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 1 de diciembre de 2015 21:01

Todas las respuestas

  • Puedes utilizar LINQ:

            Dim total As Double = 0
    
            If DGVProductos.SelectedRows.Count > 0 Then
                total = DGVProductos.SelectedRows.Cast(Of DataGridViewRow) _
                    .Select(Function(r) CType(If(r.Cells("Precio").Value, 0),Decimal)).Sum()
            End If
            textBox1.Text = total.ToString("C")


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 1 de diciembre de 2015 8:36
  • no me esta sumando solo se queda en $0.00

    esta función puede ir en un boton?

    martes, 1 de diciembre de 2015 17:49
  • Hola:

     si intentas con algo como esto:

    Dim total As Double = 0
    
    For Each fila As DataGridViewRow In DGVProductos.Rows
        If (fila.Cells("NombreColumnaCheck").Value = True) Then
            total += Convert.ToDouble(fila.Cells("Precio").Value)
        End If
    Next


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 1 de diciembre de 2015 18:10
  • gracias todos por responder 

    JoseLuis

    todavia no suma nada  una pregunta como yo tengo el datagrid vinculado con la base de datos sera por eso que no suma?

         Dim total As Double = 0
    
            For Each fila As DataGridViewRow In DGVProductos.Rows
                If (fila.Cells("Precio").Value = True) Then
                    total += Convert.ToDouble(fila.Cells("Precio").Value)
                End If
            Next
            TextBox1.Text = total


    martes, 1 de diciembre de 2015 18:21
  • Hola:

     No eso no tiene nada que ver,  intenta con algo como esto:

    Dim total As Double = 0
    
    For Each fila As DataGridViewRow In DGVProductos.Rows
    	Dim cellIsSelected As DataGridViewCheckBoxCell 
    	cellIsSelected = TryCast(row.Cells("NombrecolumnaDelCheck"), DataGridViewCheckBoxCell)
    	
    
        If Convert.ToBoolean(cellIsSelected.Value) Then
            total += Convert.ToDouble(fila.Cells("Precio").Value)
        End If
    Next
    
     Reemplaza el "NombrecolumnaDelCheck" por el nombre de la columna del tipo DataGridViewCheckBox


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 1 de diciembre de 2015 18:32
  • okay  me da un error en row .cells

     Private Sub DGVProductos_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVProductos.CellClick
            Dim ColumnaIndex As Integer = "6"
            Productos.Load(Me.DGVProductos.Rows(e.RowIndex).Cells(ColumnaIndex).Value)
            BtnBorrar.Enabled = True
    
            Dim total As Double
            For Each fila As DataGridViewRow In DGVProductos.Rows
                Dim cellIsSelected As DataGridViewCheckBoxCell
                cellIsSelected = TryCast(row.Cells("Precio"), DataGridViewCheckBoxCell)
    
    
                If Convert.ToBoolean(cellIsSelected.Value) Then
                    total += Convert.ToDouble(fila.Cells("Precio").Value)
                End If
            Next

    martes, 1 de diciembre de 2015 18:39
  •  Private Sub DGVProductos_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVProductos.CellClick
            Dim ColumnaIndex As Integer = "6"
            Productos.Load(Me.DGVProductos.Rows(e.RowIndex).Cells(ColumnaIndex).Value)
            BtnBorrar.Enabled = True
    
            Dim total As Double
            For Each fila As DataGridViewRow In DGVProductos.Rows
                Dim cellIsSelected As DataGridViewCheckBoxCell
                cellIsSelected = TryCast(fila.Cells("Precio"), DataGridViewCheckBoxCell)
    
    
                If Convert.ToBoolean(cellIsSelected.Value) Then
                    total += Convert.ToDouble(fila.Cells("Precio").Value)
                End If
            Next


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 1 de diciembre de 2015 18:44
  • gracias jose por todavia ayudarme

    me sale un error todavia

     If Convert.ToBoolean(cellIsSelected.Value) Then

    Object reference not set to an instance of an object.

    martes, 1 de diciembre de 2015 18:51
  • Hola:

     Pero ojo con lo que estas haciendo porque PRECIO no es la columna que seleccionas o si?, Precio es la columna que contiene el valor que deseas sumar entonces no tienes porque estar usando ese nombre en esta linea:

    cellIsSelected = TryCast(fila.Cells("Precio"), DataGridViewCheckBoxCell)

    En mi ejemplo puse:

    cellIsSelected = TryCast(row.Cells("NombrecolumnaDelCheck"), DataGridViewCheckBoxCell)

    Reemplaza PRECIO por el nombre de la columna que contiene el Check de lo contrario no funcionara.


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 1 de diciembre de 2015 18:54
  •  Dim Acumulado As Integer
            Dim Contar As Integer
    
            Acumulado = 0
    
            For Contar = 0 To DGVProductos.RowCount - 1
                If DGVProductos.Rows(Contar).Selected Then
                    Acumulado = CInt(Acumulado + DGVProductos(3, Contar).Value)
                End If
            Next Contar
    
            TextBox1.Text = (Acumulado).ToStringing
    Intente esto pero nada
    martes, 1 de diciembre de 2015 19:03
  • Hola:

     Si la columna que tiene el Check (la palomita) se llama "contar" entonces solo usa ese nombre:

     Private Sub DGVProductos_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVProductos.CellClick
            Dim ColumnaIndex As Integer = "6"
            Productos.Load(Me.DGVProductos.Rows(e.RowIndex).Cells(ColumnaIndex).Value)
            BtnBorrar.Enabled = True
    
            Dim total As Double
            For Each fila As DataGridViewRow In DGVProductos.Rows
                Dim cellIsSelected As DataGridViewCheckBoxCell
                cellIsSelected = TryCast(fila.Cells("Contar"), DataGridViewCheckBoxCell)
    
    
                If Convert.ToBoolean(cellIsSelected.Value) Then
                    total += Convert.ToDouble(fila.Cells("Precio").Value)
                End If
            Next
     Osea, validas primero si CONTAR esta seleccionado, si lo esta entonces sumas el PRECIO.


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 1 de diciembre de 2015 19:05
  • las filas no llevan checkbox

    martes, 1 de diciembre de 2015 19:34
  • Oye entonces soy yo el que esta mal, creí haber entendido que existía una columna del tipo DatagridViewcheckboxcolumn donde tu seleccionabas los registros que quieres sumar.

     ---------

     Entonces intenta algo como esto:

    Dim total As Double = 0
    
    For Each fila As DataGridViewRow In DGVProductos.SelectedRows
    
            total += Convert.ToDouble(fila.Cells("Precio").Value)
    Next
     


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 1 de diciembre de 2015 19:38
  • Ahora me sale 0

    Private Sub DGVProductos_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVProductos.CellClick
            Dim ColumnaIndex As Integer = "6"
            Productos.Load(Me.DGVProductos.Rows(e.RowIndex).Cells(ColumnaIndex).Value)
            BtnBorrar.Enabled = True
    
            Dim total As Double = 0
    
            For Each fila As DataGridViewRow In DGVProductos.SelectedRows
    
                total += Convert.ToDouble(fila.Cells("Precio").Value)
            Next
            txtTotal.Text = total

    martes, 1 de diciembre de 2015 19:56
  • Hola:

     Entonces ya tenemos un problema.

     Podrías mostrarme como es que estas seleccionando los registros, considera también tener la propiedad SelectionMode = FullRowSelect

     Intenta también sacando esa rutina de código del evento CellClick y poniéndolo en el evento Click de un botón solo para descartar que sea el evento el que este provocando el problema.


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 1 de diciembre de 2015 20:04
  • okay ya era  se me olvido ponerlo en fullrowselect

     en textbox solo me muestra el precio  pero no lo suma 

    pregunta jose ? como hago para que me suma  el total y a medida que cambio el precio que se actualiza  en que evento se pone en el valuechanged()



    martes, 1 de diciembre de 2015 20:18
  • Hola:

     No entendí lo ultimo. Probaste lo del boton?


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 1 de diciembre de 2015 20:36
  • si  pero no me suma los precio solo me muestra el precio de tal articulo

    For Each fila As DataGridViewRow In DGVProductos.Rows
    If fila.Cells(3).Value Is Nothing Then
    Exit Sub
    
    Else
    
    total+=Convert.ToDouble(fila.Cells("Precio").Value)
    End If
    
     Next
    
    TextBox1.Text = Format(total, "#,##0.00")
    

    lo que digo es aqui me muestra el precio total de todos los precio si yo quiero cambiar el precio de algun articulo que cambie el total 

    en que evento se puede poner en el datagridview  para que se actualiza   cada vez que cambio el precio

    martes, 1 de diciembre de 2015 20:50
  • Hola:

     Pero porque no sigues lo que se te indica?

     Te pedi que usaras:

    For Each fila As DataGridViewRow In DGVProductos.SelectedRows
    
                total += Convert.ToDouble(fila.Cells("Precio").Value)
    Next

    De esa manera recorres solo la colección de filas seleccionadas (que desconozco cuantas tengas) y va sumando el valor de la celda de la columna Precio

     Lo mucho que puedes hacer si es que existe la posibilidad de que esta celda no tenga ningún valor es preguntar si el valor contenido es diferente a nulo Nothing en este caso y entonces sumar, pero nunca salirte del ciclo si te topas con una celda en Nothing.

    For Each fila As DataGridViewRow In DGVProductos.SelectedRows
    
    	IF(Not fila.Cells("Precio").Value is Nothing)
    	
    		total += Convert.ToDouble(fila.Cells("Precio").Value)
    	End If
    Next


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 1 de diciembre de 2015 21:01
  • si pero quiero saber por si acaso me presenta en una situación

    Private Sub DGVProductos_CurrentCellChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DGVProductos.CurrentCellChanged
            Dim total As Double
            For Each fila As DataGridViewRow In DGVProductos.Rows
                If fila.Cells(3).Value Is Nothing Then
                    Exit Sub
    
                Else
    
                    total += Convert.ToDouble(fila.Cells("Precio").Value)
                End If
    
            Next
    
            txtTotal.Text = Format(total, "#,##0.00")
        End Sub
    aqui me cambia el total cade vez que cambio el precio     pero cuando cambio el precio a 66  el txttotal.text= 66 hasta que doy click al precio


    • Editado R3Z222 martes, 1 de diciembre de 2015 21:20
    martes, 1 de diciembre de 2015 21:19