none
Dar formato a campo numérico en DataGridView RRS feed

  • Pregunta

  • Hola a tod@s.

    Estoy intentando dar un formato a una casilla del DGV para que me de los datos que obtiene desde la bbdd como número telefónico pero no logro que me funcione.

    En la bbdd aparece todo junto 666555444 y quiero que al recuperar datos y aparecer en DGV aparezca como 666 555 444, estoy usando lo siguiente.

    Form_List_Prof.DtG1_ListProf.Columns(5).DefaultCellStyle.Format = "### ### ###"

    Y no hay manera de que haga nada al respecto al mostrar los datos.

    Espero vuestra ayuda, un saludo y mil gracias.

    viernes, 18 de octubre de 2019 7:36

Respuestas

Todas las respuestas

  • Utiliza el evento CellFormatting del datagridview de esta forma:

    Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting

        If e.ColumnIndex = 0 AndAlso Not e.Value Is Nothing Then

            Dim Num As Long = Long.Parse(e.Value.ToString())  ' Lo paso a numérico para poder darle el formato
            e.Value = Num.ToString("### ### ###")

        End If
    End Sub


    Saludos, Javier J

    • Propuesto como respuesta Pablo Rubio viernes, 18 de octubre de 2019 18:33
    viernes, 18 de octubre de 2019 9:31
  • No me vale dado que es para hacerlo en el formulario y yo estoy creándolo en un módulo para las funciones y las llamo desde el formulario.

    Lo tengo así.

     If BD.Dt.Tables.Contains("Datos") Then
                BD.Dt.Tables("Datos").Clear()
            End If
    
            BD.Ad.Fill(BD.Dt, "Datos")
    
            With BD.Dt.Tables("Datos")
                If .Rows.Count <> 0 Then
                    .Columns(0).ReadOnly = True
                    .Columns(1).ReadOnly = True
                    .Columns(2).ReadOnly = True
                    .Columns(3).ReadOnly = True
                    .Columns(4).ReadOnly = True
                    .Columns(5).ReadOnly = True
                    .Columns(6).ReadOnly = True
                    .Columns(7).ReadOnly = True
                    .Columns(8).ReadOnly = True
                    .Columns(9).ReadOnly = True
                    .Columns(10).ReadOnly = True
                    .Columns(11).ReadOnly = True
    
                    Form_List_Prof.DtG1_ListProf.RowHeadersVisible = False
                    Form_List_Prof.DtG1_ListProf.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
                    Form_List_Prof.DtG1_ListProf.DataSource = BD.Dt.Tables("Datos")
                    Form_List_Prof.DtG1_ListProf.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomLeft
                    Form_List_Prof.DtG1_ListProf.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomLeft
                    Form_List_Prof.DtG1_ListProf.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomLeft
                    Form_List_Prof.DtG1_ListProf.Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(5).DefaultCellStyle.Format = "### ### ###"
                    Form_List_Prof.DtG1_ListProf.Columns(6).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomLeft
                    Form_List_Prof.DtG1_ListProf.Columns(7).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(8).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(9).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(10).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(11).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                End If
            End With

    • Propuesto como respuesta Pablo Rubio viernes, 18 de octubre de 2019 18:33
    viernes, 18 de octubre de 2019 17:54
  • Hola:
    Lo que tienes que hacer para que "tome" el formato es convertir a numero la columna telefono
    En un Form con 1 DGV, copia y pega el siguiente codigo

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Public Class Form1

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Try
                Dim msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"
                Dim mDataTable As New DataTable
                ' Configuramos una conexión con el origen de datos.
                Using loConexion As New SqlConnection(msCadenaSQL)
                    ' crear adaptadores
                    Dim loDataAdapter As New SqlDataAdapter("Select cast(TELEFONO as int) as NumExterior From TU_TABLA", loConexion)
                    Dim loDataTable As New DataTable
                    loDataAdapter.Fill(loDataTable)
                    DataGridView1.DataSource = loDataTable
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            Me.DataGridView1.Columns(0).DefaultCellStyle.Format = "###-###-###"
        End Sub
    End Class

    P.D.
    El resultado es:

    Un saludo desde Bilbo
    Carlos

    sábado, 19 de octubre de 2019 7:10
  • Es obligado hacerlo así?

    No hay otra forma que pueda implementar en el código mío dado que ya tengo la conexión a la bbdd en un archivo que es el que usa toda la aplicación para hacer las conexiones y las funciones siempre las hago en módulos llamándolas después desde el formulario.

    De esta manera tendría una parte de código en un lado, otra en otro y conexiones a la bbdd duplicadas.

    sábado, 19 de octubre de 2019 9:42
  • Hola:
    Lo "normal" es tener una variable publica en un modulo llamada msCadenaSQL o con otro nombre que es la cadena de conexion que se usa en toda la aplicacion.
    En el ejemplo que te he puesto, no hace falta pues es solo eso, un ejemplo

    Un saludo desde Bilbo
    Carlos
    • Propuesto como respuesta Pablo Rubio martes, 22 de octubre de 2019 14:39
    sábado, 19 de octubre de 2019 19:47
  • Busco busco y busco y siempre veo lo mismo.

    DataGridView1.Columns(0).DefaultCellStyle.Format = "##,##0.00"
    

    Pero lo hago y no funciona, solo necesito poner formato a esa columna de teléfono pero sin cambiar todo el código que tengo, hay manera? porque si no lo dejo así y listo aunque quedaría más cómodo de ver como lo quiero poner yo.

    domingo, 20 de octubre de 2019 17:26
  • Hola:
    Para que funcione la siguiente instruccion
    DataGridView1.Columns(0).DefaultCellStyle.Format = "##,##0.00"
    la columna(0) tiene que ser numerica, si en la definicion de la tabla no lo es, tienes que hacer un cast de dicha columna como te puse en el ejemplo anterior

    Un saludo desde Bilbo
    Carlos

    • Propuesto como respuesta Pablo Rubio martes, 22 de octubre de 2019 14:40
    domingo, 20 de octubre de 2019 18:24
  • Hola.

    No consigo adaptarlo, es una columna la que tengo que poner con ese formato y no logro meter solo esa aparte de que me salta error al usar la sql, todo lo que tengo en la aplicación son OleDb para access.

    martes, 22 de octubre de 2019 7:48
  • No entiendo cual es el problema.

    Si lo que quieres es tener un módulo con las funciones solo tienes que crear una función a la que llames desde el evento :CellFormatting del grid:

    Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting

        If e.ColumnIndex = 0 AndAlso Not e.Value Is Nothing Then

            e.Value = TLF_Formato(e.Value.ToString())

        End If
    End Sub

    En el módulo:

    Public Function TLF_Formato (Valor As String) As String

    Dim Num As Long = Long.Parse(valor)  ' Lo paso a numérico para poder darle el formato
    e.Value = Num.ToString("### ### ###")

    End Function


    Saludos, Javier J

    • Propuesto como respuesta Pablo Rubio martes, 22 de octubre de 2019 14:40
    martes, 22 de octubre de 2019 9:10
  • Hola:
    ¿Puedes poner la consulta con la que cargas el DGV?

    P.D.
    "todo lo que tengo en la aplicación son OleDb para access"
    Cuando se hace una pregunta, se tiene que poner la mayor informacion que se pueda.
    En la primera respuesta te he puesto un ejemplo usando como BD SQLServer, si hubieses puesto que tu motor es access, te lo habria puesto para acces


    Select clng(TELEFONO) as NumExterior From TU_TABLA

    Un saludo desde Bilbo
    Carlos

    martes, 22 de octubre de 2019 11:14
  • Buenas tardes.

    Disculpa, no caí en ello.

    La consulta la tengo así.

    BD.Ad = New OleDb.OleDbDataAdapter(
            "SELECT
             L_NIE & DNI & L_DNI AS [DNI], Nombre AS [NOMBRE], P_Apellido AS [PRIMER APELLIDO], S_Apellido AS [SEGUNDO APELLIDO] , F_Nacimiento AS [FECHA NACIMIENTO],
                Movil AS [MÓVIL] , Email AS [EMAIL] FROM Profesionales WHERE DNI LIKE '" & Form_List_Prof.TB_Buscar.Text & "%' ORDER BY 2", BD.ClassConecta.Cs)
    
    If BD.Dt.Tables.Contains("Datos") Then
                BD.Dt.Tables("Datos").Clear()
            End If
    
    
            BD.Ad.Fill(BD.Dt, "Datos")
    
            With BD.Dt.Tables("Datos")
                If .Rows.Count <> 0 Then
                    .Columns(0).ReadOnly = True
                    .Columns(1).ReadOnly = True
                    .Columns(2).ReadOnly = True
                    .Columns(3).ReadOnly = True
                    .Columns(4).ReadOnly = True
                    .Columns(5).ReadOnly = True
                    .Columns(6).ReadOnly = True
                    .Columns(7).ReadOnly = True
                    .Columns(8).ReadOnly = True
                    .Columns(9).ReadOnly = True
                    .Columns(10).ReadOnly = True
                    .Columns(11).ReadOnly = True
    
                   
    
                    Form_List_Prof.DtG1_ListProf.RowHeadersVisible = False
                    Form_List_Prof.DtG1_ListProf.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
                    Form_List_Prof.DtG1_ListProf.DataSource = BD.Dt.Tables("Datos")
                    Form_List_Prof.DtG1_ListProf.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomLeft
                    Form_List_Prof.DtG1_ListProf.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomLeft
                    Form_List_Prof.DtG1_ListProf.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomLeft
                    Form_List_Prof.DtG1_ListProf.Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(6).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomLeft
                    Form_List_Prof.DtG1_ListProf.Columns(7).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(8).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(9).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(10).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                    Form_List_Prof.DtG1_ListProf.Columns(11).DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
                End If
            End With
    Tendría que darle el formato a la columna (5) que corresponde al Móvil.

    martes, 22 de octubre de 2019 19:34
  • Hola:

    Cambia Movil AS [MÓVIL] por
    cLng(Movil) AS [MÓVIL]

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Águila6 miércoles, 23 de octubre de 2019 7:11
    martes, 22 de octubre de 2019 20:17
  • Ahora sí que sí, perfecto.

    Mil gracias a todos por las ayudas, sois geniales.

    miércoles, 23 de octubre de 2019 7:11