none
multiplicar un datagridviewcomboboxcolumn RRS feed

  • Pregunta

  • hola amigos

    Quisiera saber como hacer que un datagridviewcomboboxcolumn se pueda realizar una operacion con una columna de la grilla. Lo que quiero es que en el combobox de la grilla pueda seleccionar el iva del 10% o del 5% y este pueda realizar la operacion del porcentaje del iva una vez que se seleccione uno de ellos. Este codigo me funcionaba bien con una columna normal de la grilla pero ahora quiero que este sea un datagridviewcomboboxcolumn espero puedan ayudarme.

      If ivaa = "10% " Then
                            ivaaa = Dt_Valor1 * (Dt_Valor2 / 11)
                            dgfactura_venta.Rows(e.RowIndex).Cells("subtotal_iva").Value = (ivaaa)
                        Else
                            If ivaaa = "5% " Then
                                ivaaa = Dt_Valor1 * (Dt_Valor2 / 21)
                                dgfactura_venta.Rows(e.RowIndex).Cells("subtotal_iva").Value = (ivaaa)
    
    
                            End If


    Zuni

    domingo, 4 de octubre de 2015 2:35

Respuestas

  • "Eliza03-22" preguntó:

    > Quisiera saber como hacer que un datagridviewcomboboxcolumn se pueda realizar
    > una operacion con una columna de la grilla. Lo que quiero es que en el combobox
    > de la grilla pueda seleccionar el iva del 10% o del 5% y este pueda realizar la
    > operacion del porcentaje del iva una vez que se seleccione uno de ellos.

    Hola:

    Vamos a suponer que en tu control DataGridView tienes 4 columnas: la primera (llamada Base) se corresponde con el precio base del producto; la segunda (llamada TipoIva que es del tipo DataGridViewComboBoxColumn) es la que contiene los diferentes tipos de IVA; la tercera (llamada Iva) es la que contiene el precio del IVA; y la cuarta (llamada Total) es la que contiene la suma del precio más el iva. Por supuesto, la tercera y cuarta columnas tendrán que ser de sólo lectura para que nadie escriba ahí lo que le venga en gana. ;-)

    En el evento Load del formulario añadirías los diferentes tipos de IVA existentes en tu país, que para el caso de España serían los siguientes:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Cargamos en el control DataGridViewComboBoxColumn
            ' los diferentes tipos de IVA.
            TipoIVA.Items.Add("21")
            TipoIVA.Items.Add("10")
            TipoIVA.Items.Add("4")
    
            ' Hacemos que las columnas Iva y Total del control
            ' DataGridView sean de sólo lectura.
            '
            iva.ReadOnly = True
            Total.ReadOnly = True
    
        End Sub

    Y ahora, en el evento CurrentCellDirtyStateChanged del control DataGridView es donde efectuarías el cálculo del IVA y del precio total del producto, ya que este evento se desencadenará cuando se hayan producido cambios en el control DataGridView y se encuentren pendientes de confirmar:

    Private Sub dgfactura_venta_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles dgfactura_venta.CurrentCellDirtyStateChanged If (dgfactura_venta.IsCurrentCellDirty) Then ' Si en la celda actual hay cambios por confirmar, los confirmamos. dgfactura_venta.CommitEdit(DataGridViewDataErrorContexts.Commit) ' Tenemos que abandonar el procedimiento, porque si no ' puede que el código se ejecute dos veces. Return End If ' Fila actual del control DataGridView Dim currentRow As DataGridViewRow = dgfactura_venta.CurrentRow ' Valor seleccionado en la celda de la columna tipo DataGridViewComboBoxColumn. Dim tipoIva As Decimal = Convert.ToDecimal(currentRow.Cells("TipoIva").Value)

            ' Valor correspondiente al precio Base cuyo IVA se desea obtener.
            Dim base As Decimal
            Dim bln As Boolean = Decimal.TryParse(Convert.ToString(currentRow.Cells("Base").Value), base)
            If (Not bln) Then
                ' No se ha especificado un valor Decimal en la celda
                ' correspondiente al precio del producto. Al estar
                ' realizando operaciones matemáticas utilizo el
                ' método Decimal.TryParse para que no se produzca
                ' una excepción si el valor de la celda no se puede
                ' convertir al tipo de dato Decimal.
                '
                MessageBox.Show("No se ha especificado un valor numérico válido.")
            End If

    ' Calculamos el IVA y mostramos el valor formateado en su celda correspondiente. Dim iva As Decimal = base * tipoIva / 100 currentRow.Cells("iva").Value = String.Format("{0:N2}", iva)

    ' Calculamos el importe total y mostramos el valor formateado en su celda correspondiente. Dim total As Decimal = base + iva currentRow.Cells("Total").Value = String.Format("{0:N2}", total)
    End Sub


    Como podrás observar, cada vez que se modifique el valor del precio del producto, o se seleccione un tipo de iva diferente, automáticamente se actualizarán el valor de las columnas Iva y Total.

    Por supuesto, el nombre de los valores de las columnas del control DataGridView que aparecen en el ejemplo los puedes modificar por aquellos que tienen las columnas de tu control DataGridView llamado dgfactura_venta.

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 4 de octubre de 2015 9:24
    Moderador
  • "Eliza03-22" escribió:

    > donde no entiendo es como referenciar mi combobox en un if

    ¿Has leído bien el contenido de mi primera respuesta?

    [...] la segunda (llamada TipoIva que es del tipo DataGridViewComboBoxColumn) es la que contiene los diferentes tipos de IVA [...]

    En mi ejemplo, la columna tipo DataGridViewComboBoxColum se llama TipoIva. ¿Cómo se llama tu columna tipo DataGridViewComboBoxColum existente en el control DataGridView?

    Una vez que sepas cómo se llama, tan solo tienes que sustituir el nombre TipoIva por el nombre de tu columna tipo DataGridViewComboBoxColum en la siguiente línea:

        ' Valor seleccionado en la celda de la columna tipo DataGridViewComboBoxColumn.
        Dim tipoIva As Decimal = Convert.ToDecimal(currentRow.Cells("TipoIva").Value)
    

    Por tanto, entiendo que no es necesario que referencies dicha columna, porque su valor actualmente seleccionado lo tienes en la variable del tipo Decimal llamada tipoIva.

    ¿Que deseas hacer un "if"? Hazlo con el valor que tenga la variable tipoIva:

        If (tipoIva = 10) Then
            ' Ejecutar aquí lo que proceda cuando el tipo de Iva sea del 10%.
    
        ElseIf(tipoIva = 5) Then
            ' Ejecutar aquí lo que proceda cuando el tipo de Iva sea del 5%.
    
        End If
    


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 7 de octubre de 2015 14:33
    Moderador

Todas las respuestas

  • "Eliza03-22" preguntó:

    > Quisiera saber como hacer que un datagridviewcomboboxcolumn se pueda realizar
    > una operacion con una columna de la grilla. Lo que quiero es que en el combobox
    > de la grilla pueda seleccionar el iva del 10% o del 5% y este pueda realizar la
    > operacion del porcentaje del iva una vez que se seleccione uno de ellos.

    Hola:

    Vamos a suponer que en tu control DataGridView tienes 4 columnas: la primera (llamada Base) se corresponde con el precio base del producto; la segunda (llamada TipoIva que es del tipo DataGridViewComboBoxColumn) es la que contiene los diferentes tipos de IVA; la tercera (llamada Iva) es la que contiene el precio del IVA; y la cuarta (llamada Total) es la que contiene la suma del precio más el iva. Por supuesto, la tercera y cuarta columnas tendrán que ser de sólo lectura para que nadie escriba ahí lo que le venga en gana. ;-)

    En el evento Load del formulario añadirías los diferentes tipos de IVA existentes en tu país, que para el caso de España serían los siguientes:

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            ' Cargamos en el control DataGridViewComboBoxColumn
            ' los diferentes tipos de IVA.
            TipoIVA.Items.Add("21")
            TipoIVA.Items.Add("10")
            TipoIVA.Items.Add("4")
    
            ' Hacemos que las columnas Iva y Total del control
            ' DataGridView sean de sólo lectura.
            '
            iva.ReadOnly = True
            Total.ReadOnly = True
    
        End Sub

    Y ahora, en el evento CurrentCellDirtyStateChanged del control DataGridView es donde efectuarías el cálculo del IVA y del precio total del producto, ya que este evento se desencadenará cuando se hayan producido cambios en el control DataGridView y se encuentren pendientes de confirmar:

    Private Sub dgfactura_venta_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles dgfactura_venta.CurrentCellDirtyStateChanged If (dgfactura_venta.IsCurrentCellDirty) Then ' Si en la celda actual hay cambios por confirmar, los confirmamos. dgfactura_venta.CommitEdit(DataGridViewDataErrorContexts.Commit) ' Tenemos que abandonar el procedimiento, porque si no ' puede que el código se ejecute dos veces. Return End If ' Fila actual del control DataGridView Dim currentRow As DataGridViewRow = dgfactura_venta.CurrentRow ' Valor seleccionado en la celda de la columna tipo DataGridViewComboBoxColumn. Dim tipoIva As Decimal = Convert.ToDecimal(currentRow.Cells("TipoIva").Value)

            ' Valor correspondiente al precio Base cuyo IVA se desea obtener.
            Dim base As Decimal
            Dim bln As Boolean = Decimal.TryParse(Convert.ToString(currentRow.Cells("Base").Value), base)
            If (Not bln) Then
                ' No se ha especificado un valor Decimal en la celda
                ' correspondiente al precio del producto. Al estar
                ' realizando operaciones matemáticas utilizo el
                ' método Decimal.TryParse para que no se produzca
                ' una excepción si el valor de la celda no se puede
                ' convertir al tipo de dato Decimal.
                '
                MessageBox.Show("No se ha especificado un valor numérico válido.")
            End If

    ' Calculamos el IVA y mostramos el valor formateado en su celda correspondiente. Dim iva As Decimal = base * tipoIva / 100 currentRow.Cells("iva").Value = String.Format("{0:N2}", iva)

    ' Calculamos el importe total y mostramos el valor formateado en su celda correspondiente. Dim total As Decimal = base + iva currentRow.Cells("Total").Value = String.Format("{0:N2}", total)
    End Sub


    Como podrás observar, cada vez que se modifique el valor del precio del producto, o se seleccione un tipo de iva diferente, automáticamente se actualizarán el valor de las columnas Iva y Total.

    Por supuesto, el nombre de los valores de las columnas del control DataGridView que aparecen en el ejemplo los puedes modificar por aquellos que tienen las columnas de tu control DataGridView llamado dgfactura_venta.

    Un saludo


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 4 de octubre de 2015 9:24
    Moderador
  • Muchas gracias Enrique por la ayuda pero creo que no fui muy especifica con lo que necesito

    al hacer el calculo del iva tengo 2 tipos de iva uno del 5% y el otro del 10%

     cada uno de ellos se calcula de forma diferente de la siguiente manera 

    If ivaa = "10% " Then
                            ivaaa = Dt_Valor1 * (Dt_Valor2 / 11)
                            dgfactura_venta.Rows(e.RowIndex).Cells("subtotal_iva").Value = (ivaaa)
                        Else
                            If ivaaa = "5% " Then
                                ivaaa = Dt_Valor1 * (Dt_Valor2 / 21)
                                dgfactura_venta.Rows(e.RowIndex).Cells("subtotal_iva").Value = (ivaaa)
    
    
                            End If


    Zuni

    miércoles, 7 de octubre de 2015 11:38
  • donde Dt_Valor1 es la cantidad de producto que ingreso multiplicado por Dt_valor2 que es el precio / 11

    Zuni

    miércoles, 7 de octubre de 2015 11:39
  • "Eliza03-22" escribió:

    > creo que no fui muy especifica con lo que necesito
    >
    > al hacer el calculo del iva tengo 2 tipos de iva uno del 5% y el otro del 10%
    >
    > cada uno de ellos se calcula de forma diferente de la siguiente manera

    En el ejemplo del procedimiento dgfactura_venta_CurrentCellDirtyStateChanged que te indiqué, yo calculé el IVA de acuerdo a las operaciones matemáticas de obtener un tanto por ciento y sumárselo a la base o al precio sin IVA del producto, que es como yo entiendo que se calcula el IVA y el precio final del producto, o al menos así es como se realiza en España. ¿Que tu necesitas realizar otros cálculos diferentes? La solución creo que no puede ser tan sencilla como modificar el citado procedimiento y escribir las operaciones matemáticas que necesitas efectuar. En definitiva, adaptar el ejemplo a tus necesidades. ;-)


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 7 de octubre de 2015 12:16
    Moderador
  • si entiendo como adaptar el calculo pero donde no entiendo es como referenciar mi combobox en un if 

    Zuni

    miércoles, 7 de octubre de 2015 12:39
  • "Eliza03-22" escribió:

    > donde no entiendo es como referenciar mi combobox en un if

    ¿Has leído bien el contenido de mi primera respuesta?

    [...] la segunda (llamada TipoIva que es del tipo DataGridViewComboBoxColumn) es la que contiene los diferentes tipos de IVA [...]

    En mi ejemplo, la columna tipo DataGridViewComboBoxColum se llama TipoIva. ¿Cómo se llama tu columna tipo DataGridViewComboBoxColum existente en el control DataGridView?

    Una vez que sepas cómo se llama, tan solo tienes que sustituir el nombre TipoIva por el nombre de tu columna tipo DataGridViewComboBoxColum en la siguiente línea:

        ' Valor seleccionado en la celda de la columna tipo DataGridViewComboBoxColumn.
        Dim tipoIva As Decimal = Convert.ToDecimal(currentRow.Cells("TipoIva").Value)
    

    Por tanto, entiendo que no es necesario que referencies dicha columna, porque su valor actualmente seleccionado lo tienes en la variable del tipo Decimal llamada tipoIva.

    ¿Que deseas hacer un "if"? Hazlo con el valor que tenga la variable tipoIva:

        If (tipoIva = 10) Then
            ' Ejecutar aquí lo que proceda cuando el tipo de Iva sea del 10%.
    
        ElseIf(tipoIva = 5) Then
            ' Ejecutar aquí lo que proceda cuando el tipo de Iva sea del 5%.
    
        End If
    


    Enrique Martínez Montejo
            [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 7 de octubre de 2015 14:33
    Moderador