none
Aumentar Cantidad Datagridview

    Pregunta

  • Tengo el siguiente form, lo que quiero es que al apretar el botón agregar la fila seleccionada la cantidad aumente en 1 y si apretóquitar disminuya en 1, lo eh intentado, pero no me resulta, estaría muy agradecido 

    domingo, 9 de octubre de 2016 6:04

Respuestas

  • Hola El_vena,

    Creo que además, tienes que validar que el botón btnQuitar no disminuya la cantidad por debajo de 0, -1, -2 ...

    Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles btnAgregar.Click
            If DataGridView1.CurrentRow IsNot Nothing Then
                Dim celda = DataGridView1.CurrentRow.Cells("CANTIDAD")
                celda.Value = CInt(celda.Value) + 1
            End If
        End Sub

    Y al quitar la cantidad :

    Private Sub btnQuitar_Click(sender As Object, e As EventArgs) Handles btnQuitar.Click
            If DataGridView1.CurrentRow IsNot Nothing Then
                Dim celda = DataGridView1.CurrentRow.Cells("CANTIDAD")
                If CInt(celda.Value) > 1 Then 'Si la cantidad es mayor a 1 le resta, si es 1 no hace nada
                    celda.Value = CInt(celda.Value) - 1
                End If
            End If
        End Sub

    Dónde valido que el valor mínimo que debe tener la cantidad es 1, ya que no tendría sentido disminuirla a 0, verdad ?

    Además, tendrías que cambiar el valor de la columna TOTAL ? que es PRECIO * CANTIDAD no es así ? Puedes hacer uso del evento CellValueChanged.

      Private Sub DataGridView1_CellValueChanged(sender As ..........
            If DataGridView1.Columns(e.ColumnIndex).Name = "CANTIDAD" Then
                Dim fila = DataGridView1.CurrentRow
                fila.Cells("TOTAL").Value = CInt(fila.Cells("CANTIDAD").Value) *
                                            CDbl(fila.Cells("PRECIO").Value)
            End If
        End Sub

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    domingo, 9 de octubre de 2016 16:57
  • Hola:
    En un Form como el de la imagen

    copia y pega el siguiente codigo

    Public Class Form1
        Private moDataTable As New DataTable
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            'Añadimos las columnas.
            moDataTable.Columns.Add(New DataColumn("Id", Type.GetType("System.Int16")))
            moDataTable.Columns.Add(New DataColumn("Cantidad", Type.GetType("System.Int16")))
            Me.dgrDataTable.DataSource = moDataTable
            'Añadir datos
            Dim lDataRow As DataRow = moDataTable.NewRow
            lDataRow.Item("Id") = 1
            lDataRow.Item("Cantidad") = 5
            moDataTable.Rows.Add(lDataRow)
            '
            lDataRow = moDataTable.NewRow
            lDataRow.Item("Id") = 2
            lDataRow.Item("Cantidad") = 10
            moDataTable.Rows.Add(lDataRow)
            '
            lDataRow = moDataTable.NewRow
            lDataRow.Item("Id") = 3
            lDataRow.Item("Cantidad") = 15
            moDataTable.Rows.Add(lDataRow)
            '
            lDataRow = moDataTable.NewRow
            lDataRow.Item("Id") = 4
            lDataRow.Item("Cantidad") = 20
            moDataTable.Rows.Add(lDataRow)
            '
        End Sub
        Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles btnAgregar.Click
            Dim loFila As DataGridViewRow = Me.dgrDataTable.CurrentRow()
            loFila.Cells("Cantidad").Value = CInt(loFila.Cells("Cantidad").Value) + 1
        End Sub

        Private Sub btnQuitar_Click(sender As Object, e As EventArgs) Handles btnQuitar.Click
            Dim loFila As DataGridViewRow = Me.dgrDataTable.CurrentRow()
            loFila.Cells("Cantidad").Value = CInt(loFila.Cells("Cantidad").Value) - 1
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    domingo, 9 de octubre de 2016 8:32
  • Te dejo una rutina simple para restringir el ingreso de valores numéricos:

    Private Sub DataGridView1_EditingControlShowing(sender As Object, e As ...
    	RemoveHandler e.Control.KeyPress, AddressOf Cell_KeyPress
    	If DataGridView1.CurrentCell.ColumnIndex = 0 Then 'Índice de la columna cantidad
    
    		Dim tbx As TextBox = TryCast(e.Control, TextBox)
    
    		If tbx IsNot Nothing Then
    			AddHandler tbx.KeyPress, AddressOf Cell_KeyPress
    		End If
    	End If
    End Sub
    
    Private Sub Cell_KeyPress(sender As Object, e As KeyPressEventArgs)
    	If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) Then
    		e.Handled = True
    	End If
    End Sub



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 9 de octubre de 2016 19:42

Todas las respuestas

  • Hola:
    En un Form como el de la imagen

    copia y pega el siguiente codigo

    Public Class Form1
        Private moDataTable As New DataTable
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            'Añadimos las columnas.
            moDataTable.Columns.Add(New DataColumn("Id", Type.GetType("System.Int16")))
            moDataTable.Columns.Add(New DataColumn("Cantidad", Type.GetType("System.Int16")))
            Me.dgrDataTable.DataSource = moDataTable
            'Añadir datos
            Dim lDataRow As DataRow = moDataTable.NewRow
            lDataRow.Item("Id") = 1
            lDataRow.Item("Cantidad") = 5
            moDataTable.Rows.Add(lDataRow)
            '
            lDataRow = moDataTable.NewRow
            lDataRow.Item("Id") = 2
            lDataRow.Item("Cantidad") = 10
            moDataTable.Rows.Add(lDataRow)
            '
            lDataRow = moDataTable.NewRow
            lDataRow.Item("Id") = 3
            lDataRow.Item("Cantidad") = 15
            moDataTable.Rows.Add(lDataRow)
            '
            lDataRow = moDataTable.NewRow
            lDataRow.Item("Id") = 4
            lDataRow.Item("Cantidad") = 20
            moDataTable.Rows.Add(lDataRow)
            '
        End Sub
        Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles btnAgregar.Click
            Dim loFila As DataGridViewRow = Me.dgrDataTable.CurrentRow()
            loFila.Cells("Cantidad").Value = CInt(loFila.Cells("Cantidad").Value) + 1
        End Sub

        Private Sub btnQuitar_Click(sender As Object, e As EventArgs) Handles btnQuitar.Click
            Dim loFila As DataGridViewRow = Me.dgrDataTable.CurrentRow()
            loFila.Cells("Cantidad").Value = CInt(loFila.Cells("Cantidad").Value) - 1
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    domingo, 9 de octubre de 2016 8:32
  • Hola El_vena,

    Creo que además, tienes que validar que el botón btnQuitar no disminuya la cantidad por debajo de 0, -1, -2 ...

    Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles btnAgregar.Click
            If DataGridView1.CurrentRow IsNot Nothing Then
                Dim celda = DataGridView1.CurrentRow.Cells("CANTIDAD")
                celda.Value = CInt(celda.Value) + 1
            End If
        End Sub

    Y al quitar la cantidad :

    Private Sub btnQuitar_Click(sender As Object, e As EventArgs) Handles btnQuitar.Click
            If DataGridView1.CurrentRow IsNot Nothing Then
                Dim celda = DataGridView1.CurrentRow.Cells("CANTIDAD")
                If CInt(celda.Value) > 1 Then 'Si la cantidad es mayor a 1 le resta, si es 1 no hace nada
                    celda.Value = CInt(celda.Value) - 1
                End If
            End If
        End Sub

    Dónde valido que el valor mínimo que debe tener la cantidad es 1, ya que no tendría sentido disminuirla a 0, verdad ?

    Además, tendrías que cambiar el valor de la columna TOTAL ? que es PRECIO * CANTIDAD no es así ? Puedes hacer uso del evento CellValueChanged.

      Private Sub DataGridView1_CellValueChanged(sender As ..........
            If DataGridView1.Columns(e.ColumnIndex).Name = "CANTIDAD" Then
                Dim fila = DataGridView1.CurrentRow
                fila.Cells("TOTAL").Value = CInt(fila.Cells("CANTIDAD").Value) *
                                            CDbl(fila.Cells("PRECIO").Value)
            End If
        End Sub

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    domingo, 9 de octubre de 2016 16:57
  • El_vena,

    Pienso que por temas de usabilidad no es correcto incrementar o decrementar la cantidad solicitada tras pulsar un botón, ¿te imaginas si solicitan 20 unidades de un producto? ¿tendrás al operador presionando 20 veces el botón?. Si es un ejercicio con objetivos de aprendizaje puede permitirse, pero dicha implementación en la vida real es inadecuada.

    Lo adecuado es que permitas al usuario editar sobre la celda la cantidad de unidades solicitadas, la clase DataGridView permite la edición de las celdas, lo único a cuidar será que el valor ingresado se restringa a sólo valores numéricos que tampoco es complicado.

    Espero lo consideres.

    domingo, 9 de octubre de 2016 19:29
  • Te dejo una rutina simple para restringir el ingreso de valores numéricos:

    Private Sub DataGridView1_EditingControlShowing(sender As Object, e As ...
    	RemoveHandler e.Control.KeyPress, AddressOf Cell_KeyPress
    	If DataGridView1.CurrentCell.ColumnIndex = 0 Then 'Índice de la columna cantidad
    
    		Dim tbx As TextBox = TryCast(e.Control, TextBox)
    
    		If tbx IsNot Nothing Then
    			AddHandler tbx.KeyPress, AddressOf Cell_KeyPress
    		End If
    	End If
    End Sub
    
    Private Sub Cell_KeyPress(sender As Object, e As KeyPressEventArgs)
    	If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) Then
    		e.Handled = True
    	End If
    End Sub



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 9 de octubre de 2016 19:42