none
Acumular el Saldo en un DataGridView RRS feed

  • Pregunta

  • Hola!

    Este codigo esta funcionando perfecto, mi pregunta es la siguiente: yo tengo tres columnas "Debe" "Haber" y "Saldo", mi necesidad es que me vaya acumulando el saldo en la columna "Saldo", sabiendo que el calculo del saldo es

    Saldo= Saldo + Debe - Haber

    Desde ya muchas gracias!

    Saludos!

    Public Class Form1
        Private mDataTable As New DataTable
        Private debe As Decimal
        Private haber As Decimal
        Private saldo As Decimal
        Private styDec As New DataGridViewCellStyle()


        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim lDataColumn As DataColumn
            lDataColumn = New DataColumn("Referencias")
            mDataTable.Columns.Add(lDataColumn)
            lDataColumn = New DataColumn("Debe", GetType(Decimal))
            mDataTable.Columns.Add(lDataColumn)
            lDataColumn = New DataColumn("Haber", GetType(Decimal))
            mDataTable.Columns.Add(lDataColumn)
            lDataColumn = New DataColumn("Saldo", GetType(Decimal))
            mDataTable.Columns.Add(lDataColumn)
            mDataTable.Rows.Add()
            Me.DataGridView1.DataSource = mDataTable


            DataGridView1.Columns(0).Width = 350
            DataGridView1.Rows(0).Height = 20
            DataGridView1.RowTemplate.Height = 20
            DataGridView1.AllowUserToAddRows = False


        End Sub


        Private Sub DataGridView1_AutoSizeRowsModeChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewAutoSizeModeEventArgs) Handles DataGridView1.AutoSizeRowsModeChanged

        End Sub


        Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
            Dim row As DataGridViewRow = CType(DataGridView1.Rows(e.RowIndex), DataGridViewRow)


            styDec.Alignment = DataGridViewContentAlignment.MiddleRight
            styDec.Format = "N2"

            'mDataTable.Rows.Add()

            If DataGridView1.Columns("Debe").ValueType Is GetType(Decimal) Then
                DataGridView1.Columns("Debe").DefaultCellStyle = styDec
            End If


            If DataGridView1.Columns("Haber").ValueType Is GetType(Decimal) Then
                DataGridView1.Columns("Haber").DefaultCellStyle = styDec
            End If


            If row.Cells("Debe").Value IsNot DBNull.Value Then
                debe = row.Cells("Debe").Value
            End If


            If row.Cells("Haber").Value IsNot DBNull.Value Then
                haber = row.Cells("Haber").Value
            End If

       End Sub


        Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown

           If e.KeyCode = Keys.Enter Then
                If (DataGridView1.RowCount > 0) Then
                    mDataTable.Rows.Add()
                    DataGridView1.AllowUserToAddRows = False
                End If
            End If
        End Sub


    Mario Rossi

    domingo, 25 de marzo de 2012 5:32

Todas las respuestas

  • pero en que momento es que quieres realizar esta accion? porque veo alli el CellEndEdit, es allin donde necesitas realziar el calculo

    o es que quieres realizarlo en algun For Each calculando para todas las filas

    la columna saldo no esta enlazada a ningun campo de datos que asignas,no ?

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 25 de marzo de 2012 14:05
  • Hola Leandro!

    No la columna saldo no esta enlazada a ningun campo de datos, y si quiero calcularlo para todas las filas, podria ser con un For Each.

    Como lo haria?

    Gracias Leandro!

    Saludos!


    Mario Rossi

    domingo, 25 de marzo de 2012 16:15
  • esta columna saldo deberia ir trabjando sobre los datos previos no ?

    Dim saldo As Integer = 0
    
    For Each row As DatagridViewRow In DatagridView1.Rows
    
        Dim debe As Integer = 0  
        Int32.TryParse(row.Cells("debe").Value, debe)
    
        Dim haber As Integer = 0  
        Int32.TryParse(row.Cells("haver").Value, haber)
    
        saldo = saldo + debe - haber
    
        row.Cells("saldo").Value = CStr(saldo)
    
    Next

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 25 de marzo de 2012 17:27
  • Gracias Leandro!

    Lo voy a probar y te comento

    Saludos!


    Mario Rossi

    domingo, 25 de marzo de 2012 21:07
  • Lo probe Leandro, pero en el For Each me pone el siguiente error: Error La variable 'row' oculta una variable en un bloque de inclusión.
    Saludos!

    Mario Rossi

    lunes, 26 de marzo de 2012 2:19
  • como declaraste el codigo y en que linea marca el error?

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 26 de marzo de 2012 3:03
  • Acá te paso el código Leandro,  el error me lo da en For Each row

    Public Class Form1
        Private mDataTable As New DataTable

        Private styDec As New DataGridViewCellStyle()


        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim lDataColumn As DataColumn
            lDataColumn = New DataColumn("Referencias")
            mDataTable.Columns.Add(lDataColumn)
            lDataColumn = New DataColumn("Debe", GetType(Decimal))
            mDataTable.Columns.Add(lDataColumn)
            lDataColumn = New DataColumn("Haber", GetType(Decimal))
            mDataTable.Columns.Add(lDataColumn)
            lDataColumn = New DataColumn("Saldo", GetType(Decimal))
            mDataTable.Columns.Add(lDataColumn)


            mDataTable.Rows.Add()
            Me.DataGridView1.DataSource = mDataTable


            DataGridView1.Columns(0).Width = 350
            DataGridView1.Rows(0).Height = 20
            DataGridView1.RowTemplate.Height = 20
            DataGridView1.AllowUserToAddRows = False


        End Sub


        Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
            Dim row As DataGridViewRow = CType(DataGridView1.Rows(e.RowIndex), DataGridViewRow)


            styDec.Alignment = DataGridViewContentAlignment.MiddleRight
            styDec.Format = "N2"


            'mDataTable.Rows.Add()




            If DataGridView1.Columns("Debe").ValueType Is GetType(Decimal) Then
                DataGridView1.Columns("Debe").DefaultCellStyle = styDec
            End If


            If DataGridView1.Columns("Haber").ValueType Is GetType(Decimal) Then
                DataGridView1.Columns("Haber").DefaultCellStyle = styDec
            End If
            Dim saldo As Integer = 0

            For Each row As DataGridViewRow In DataGridView1.Rows


                Dim debe As Integer = 0
                If row.Cells("Debe").Value IsNot DBNull.Value Then
                    Int32.TryParse(row.Cells("Debe").Value, debe)
                End If


                Dim haber As Integer = 0
                If row.Cells("Haber").Value IsNot DBNull.Value Then
                    Int32.TryParse(row.Cells("Haber").Value, haber)
                End If


                saldo = saldo + debe - haber


                row.Cells("Saldo").Value = CStr(saldo)
            Next
                row.Cells("Saldo").DataGridView.DefaultCellStyle = styDec


        End Sub


        Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown

            If e.KeyCode = Keys.Enter Then
                If (DataGridView1.RowCount > 0) Then
                    mDataTable.Rows.Add()
                    DataGridView1.AllowUserToAddRows = False
                End If
            End If

        End Sub
    End Class

                

    Mario Rossi

    lunes, 26 de marzo de 2012 4:27
  • el probleam esta en esta linea

            Dim row As DataGridViewRow = CType(DataGridView1.Rows(e.RowIndex), DataGridViewRow)

    defines esta y depsues el mismo row en el For Each, alli esta el problema

    si ya tienes una variable "row" en el for definele otro nombre

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 26 de marzo de 2012 12:31
  • Gracias Leandro!, me funcionó perfecto, le cambié el nombre a row y listo

    Saludos!


    Mario Rossi

    martes, 27 de marzo de 2012 5:14
  • esta columna saldo deberia ir trabjando sobre los datos previos no ?

    Dim saldo As Integer = 0
    
    For Each row As DatagridViewRow In DatagridView1.Rows
    
        Dim debe As Integer = 0  
        Int32.TryParse(row.Cells("debe").Value, debe)
    
        Dim haber As Integer = 0  
        Int32.TryParse(row.Cells("haver").Value, haber)
    
        saldo = saldo + debe - haber
    
        row.Cells("saldo").Value = CStr(saldo)
    
    Next

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    buenas tardes leandro, yo quiero hacer exactamente lo mismo pero en un tablix de informes de vb 2010...

    porfa ayuda, antetodo gracias

    sábado, 21 de abril de 2012 0:37