none
Limitar a 2 decimales ingreso datos en un datagridview RRS feed

  • Pregunta

  • Holas a todos:

    Precisaría limitar en el momento del ingreso de los datos en un datagridview, que los mismos no acepten más de 2 decimales en dicho acto. La columnas o columnas son numéricas, de tipo double, formateadas a "N2".

    Un saludo a todos.

    Gemma

    miércoles, 11 de noviembre de 2015 16:24

Respuestas

  • "gemma_campillo" escribió:

    > Esa tabla viene de Access a 2 dígitos decimales ...

    Ese valor será para que el propio Microsoft Access sepa cómo tiene que mostrar los datos cuando tu abres la tabla desde su propia interfaz de usuario, pero no quiere decir que ese valor lo respete el objeto DataTable que rellenas y que posteriormente enlazas con el control DataGridView.

    Si el tipo de dato de los campos en la tabla es Numérico Doble, lo que se almacena es un valor numérico doble, sin formato alguno, por lo que el número de decimales puede se más de 2, que es lo que tu, o tus clientes, estáis observando cuando se rellena el objeto DataTable y posteriormente se enlaza al control DataGridView.

    > los datos se insertan siempre con2 decimales
    > Por último las columnas se generan automáticamente.

    ¿Estás completamente segura de ello? Te lo pregunto porque con tu permiso estoy recuperando datos de la tabla BalSitExpl y me aparecen más de dos decimales, en algunos casos hasta 10 cifras decimales. ;-)

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                Using cmd As New OleDbCommand()
                    cmd.CommandText = "SELECT Descripcion, Codigo, Ejer_01, Ejer_02, Ejer_03, Ejer_04 FROM BalSitExpl ORDER BY Orden"
                    DataGridView1.DataSource = GetData(cmd)
                End Using
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    ¿Que deseas que solamente te aparezcan dos decimales? Pues tendrás que hacer lo mismo que haces con Access: indicarle que los valores numéricos decimales te los formatee a dos decimales.

    Una vez asignado el valor de la propiedad DataSource del control DataGridView, ejecutarías:

        ' Indicamos el formato de las columnas numéricas.
        DataGridView1.Columns(2).DefaultCellStyle.Format = "N2"
        DataGridView1.Columns(3).DefaultCellStyle.Format = "N2"
        DataGridView1.Columns(4).DefaultCellStyle.Format = "N2"
        DataGridView1.Columns(5).DefaultCellStyle.Format = "N2"

    Y si el usuario escribe más de dos decimales, cuando el foco abandone la celda que ha sido editada, automáticamente el valor se formateará a dos decimales.

    Siempre ten en la mente que cuando desde tu aplicación recuperas datos de la base de datos de Access, cualquier valor de formateo que le hayas indicado a los campos de la tabla desde el propio Microsoft Access, no surtirá efecto alguno en tu aplicación. Esos valores son para que el propio Microsoft Access conozca cómo tiene que presentar los datos al usuario, pero fuera de Microsoft Access, no tienen ningún valor.

    > ... es para ir limando asperezas en el programa ...

    Ya que dices que estás limando asperezas, aprovecho para comentarte que si en tu aplicación no haces uso de la biblioteca de Excel, mejor será que elimines del proyecto la referencia a dicha biblioteca. ;-)


    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, 11 de noviembre de 2015 19:12
    Moderador
  • "gemma_campillo" preguntó:

    > Precisaría limitar en el momento del ingreso de los datos en un datagridview,
    > que los mismos no acepten más de 2 decimales en dicho acto.

    Hola, Gemma:

    Por "dicho acto", ¿concretamente a qué te refieres? ¿Que el usuario no pueda escribir más de 2 decimales en las celdas de esa columna numérica, o que a la hora de rellenar el control DataGridView con los datos existentes en una tabla de tu base de datos de Access, los valores queden formateados a 2 decimales.

    Lo primero puede tener solución, pero referente a lo segundo, habría que redondear por exceso o defecto los valores que tengan más de dos decimales, por lo que puede que los resultados no sean los deseados.

    ¿En la base de datos los valores numéricos decimales los insertas con dos decimales o con todas las cifras decimales que le llegan?

    ¿Las columnas del control DataGridView se autogeneran automáticamente o por el contrario las creas en tiempo de diseño (DataGridView1.AutoGenerateColumns = False), y posteriormente las enlazas mediante el valor de su propiedad DataPropertyName?


    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, 11 de noviembre de 2015 18:08
    Moderador

Todas las respuestas

  • "gemma_campillo" preguntó:

    > Precisaría limitar en el momento del ingreso de los datos en un datagridview,
    > que los mismos no acepten más de 2 decimales en dicho acto.

    Hola, Gemma:

    Por "dicho acto", ¿concretamente a qué te refieres? ¿Que el usuario no pueda escribir más de 2 decimales en las celdas de esa columna numérica, o que a la hora de rellenar el control DataGridView con los datos existentes en una tabla de tu base de datos de Access, los valores queden formateados a 2 decimales.

    Lo primero puede tener solución, pero referente a lo segundo, habría que redondear por exceso o defecto los valores que tengan más de dos decimales, por lo que puede que los resultados no sean los deseados.

    ¿En la base de datos los valores numéricos decimales los insertas con dos decimales o con todas las cifras decimales que le llegan?

    ¿Las columnas del control DataGridView se autogeneran automáticamente o por el contrario las creas en tiempo de diseño (DataGridView1.AutoGenerateColumns = False), y posteriormente las enlazas mediante el valor de su propiedad DataPropertyName?


    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, 11 de noviembre de 2015 18:08
    Moderador
  • Hola maestro:

    Esta grilla a la que me refiero es la entrada de datos, carga de una tabla y muestra los datos, después al ser editable el usuario modifica o añade valores en las columnas. Esa tabla viene de Access a 2 dígitos decimales y el tema está en que el no pueda meter cuando edita la celda mas de dos decimales que además es lo que muestra la celda, el valor con 2 decimales aunque sean 0.: 0,00.

    Respondiendo a tu segunda pregunta ¿En la base de datos los valores numéricos decimales los insertas con dos decimales o con todas las cifras decimales que le llegan? , los datos se insertan siempre con2 decimales por ello era el que el usuario nada mas pueda meter como máximo dos decimales y si quiere redondear que lo haga el, ya e que esos datos vienen de la contabilidad y solo se presentan con 2 decimales.

    Por último las columnas se generan automáticamente.

    Bueno querido Enrique es para ir limando asperezas en el programa y corrigiendo pequeñas cosas que siempre las descubren los clientes, son los mejores testeadores.

    Un abrazo querido amigo.

    Gemma 

    miércoles, 11 de noviembre de 2015 18:54
  • "gemma_campillo" escribió:

    > Esa tabla viene de Access a 2 dígitos decimales ...

    Ese valor será para que el propio Microsoft Access sepa cómo tiene que mostrar los datos cuando tu abres la tabla desde su propia interfaz de usuario, pero no quiere decir que ese valor lo respete el objeto DataTable que rellenas y que posteriormente enlazas con el control DataGridView.

    Si el tipo de dato de los campos en la tabla es Numérico Doble, lo que se almacena es un valor numérico doble, sin formato alguno, por lo que el número de decimales puede se más de 2, que es lo que tu, o tus clientes, estáis observando cuando se rellena el objeto DataTable y posteriormente se enlaza al control DataGridView.

    > los datos se insertan siempre con2 decimales
    > Por último las columnas se generan automáticamente.

    ¿Estás completamente segura de ello? Te lo pregunto porque con tu permiso estoy recuperando datos de la tabla BalSitExpl y me aparecen más de dos decimales, en algunos casos hasta 10 cifras decimales. ;-)

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                Using cmd As New OleDbCommand()
                    cmd.CommandText = "SELECT Descripcion, Codigo, Ejer_01, Ejer_02, Ejer_03, Ejer_04 FROM BalSitExpl ORDER BY Orden"
                    DataGridView1.DataSource = GetData(cmd)
                End Using
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    ¿Que deseas que solamente te aparezcan dos decimales? Pues tendrás que hacer lo mismo que haces con Access: indicarle que los valores numéricos decimales te los formatee a dos decimales.

    Una vez asignado el valor de la propiedad DataSource del control DataGridView, ejecutarías:

        ' Indicamos el formato de las columnas numéricas.
        DataGridView1.Columns(2).DefaultCellStyle.Format = "N2"
        DataGridView1.Columns(3).DefaultCellStyle.Format = "N2"
        DataGridView1.Columns(4).DefaultCellStyle.Format = "N2"
        DataGridView1.Columns(5).DefaultCellStyle.Format = "N2"

    Y si el usuario escribe más de dos decimales, cuando el foco abandone la celda que ha sido editada, automáticamente el valor se formateará a dos decimales.

    Siempre ten en la mente que cuando desde tu aplicación recuperas datos de la base de datos de Access, cualquier valor de formateo que le hayas indicado a los campos de la tabla desde el propio Microsoft Access, no surtirá efecto alguno en tu aplicación. Esos valores son para que el propio Microsoft Access conozca cómo tiene que presentar los datos al usuario, pero fuera de Microsoft Access, no tienen ningún valor.

    > ... es para ir limando asperezas en el programa ...

    Ya que dices que estás limando asperezas, aprovecho para comentarte que si en tu aplicación no haces uso de la biblioteca de Excel, mejor será que elimines del proyecto la referencia a dicha biblioteca. ;-)


    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, 11 de noviembre de 2015 19:12
    Moderador
  • Hola Enrique:

    Si, es eso que comentas y lo que pasa es que el formato se lo aplico en un método donde pongo las propiedades del DatagridView: acho columnas, altura filas, colores, nombre de los headers, etc. y formateo al final con "N2", por lo tanto ese formateo tiene que ir donde tu me estás indicando y no al final. Es decir, yo únicamente tengo el método MostrarDatagridView1 por ejemplo, y ahí lo único que le cargo es la consulta que viene de la capa lógica para entendernos. Después y acto seguido le cargo las propiedades en el otro método. Por ello, el formateo lo voy a aplicar en el evento CellFormating del datagridview si te parece bien y no en las propiedades.

    Bueno maestro, dentro de poco te remito una actualización con varias cosillas que voy retocando.

    Muchas gracias como siempre querido amigo.

    Un fuerte abrazo y vez a cenar y a descansar que ya te toca.

    Gemma

    miércoles, 11 de noviembre de 2015 19:33
  • "gemma_campillo" escribió:

    > Por ello, el formateo lo voy a aplicar en el evento CellFormating del
    > datagridview si te parece bien y no en las propiedades.

    Yo entiendo que tendrías que asignar el formato en el método MostrarDatagridView1, una vez asignado el valor a la propiedad DataSource del control DataGridView, porque hacerlo en el evento CellFormatting, no pararías de estar asignando innecesariamente el valor a la propiedad Format.

    Si deseas comprobar las veces que estarías asignado el valor N2, tan solo tienes que ejecutar el siguiente código:

        Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    
            Static n As Integer = 1
    
            If (e.ColumnIndex > 1) Then
                e.CellStyle.Format = "N2"
                Console.WriteLine("Número de veces: {0}", n)
    n += 1 End If End Sub

    Para ver el resultado con el número de veces que se ha asignado el valor N2 a la propiedad Format de la celda, consulta la ventana Salida. Ten en cuenta que cada vez que se selecciona una celda cualquiera, se desencadena el evento CellFormatting. ;-)


    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, 11 de noviembre de 2015 19:49
    Moderador
  • Hola Enrique:

    Perfectamente entendido y así lo haré.

    Muchas gracias maestro.

    Gemma

    miércoles, 11 de noviembre de 2015 20:18