none
Formatear columnas de un Datagridview RRS feed

  • Pregunta

  • Hola

    Tengo un datagridview donde, entre otras, se muestran 7 columnas con datos declarados como Decimal (dinero) y busco la forma de formatearlas para que se muestren alineadas a la derecha y con el formato dinero.

    Esta claro que puedo editar la rejilla y formatear una a una cada columna, pero se me ocurre que se podria hacer con un bucle que detecte el tipo de dato y actue en consecuencia, lo que pasa es que lo intento, pero no sera tan facil cuando no doy con la manera de hacerlo. Por eso recurro a los gurus del foro de los cuales siempre se aprende.

    En cuanto tenga el codigo lo guardo como un snipet porque esta es una tarea bastante repetitiva.

    domingo, 13 de diciembre de 2015 15:10

Respuestas

  • Bueno, al final no se si es la forma mas ortodoxa de hacerlo pero funciona.

    Esta rutina formatea las columnas de una datagrid enlazada a datos que es lo que yo buscaba.

    With DataGridView1
                For filas As Integer = 0 To .RowCount - 1
                    For Col As Integer = 0 To .ColumnCount - 1
                        Select Case .Columns(Col).ValueType
                            Case Type.GetType("System.Decimal")
               .Columns(Col).DefaultCellStyle.Format = "c"
               .Columns(Col).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
               .Columns(Col).Width = 60
                            Case Type.GetType("System.String")
               .Columns(Col).Width = 150
                            Case Type.GetType("System.Int32")
                .Columns(Col).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                .Columns(Col).Width = 60
                        End Select
                    Next Col
                Next filas
            End With

    Ahora para que realmente fuese util, habria que ponerla en un modulo y poder llamarla desde cualquier formulario.y eso de momento no se como se hace.

     


    • Editado DiegC martes, 15 de diciembre de 2015 18:47
    • Marcado como respuesta Karen MalagónModerator miércoles, 23 de diciembre de 2015 18:22
    martes, 15 de diciembre de 2015 18:44

Todas las respuestas

  • amigo DiegC mira el siguiente codigo

    public Form1()
    {
      
    this.dataGridView1.Columns["UnitPrice"].DefaultCellStyle.Format = "c";
    }

    Claro esta en C# pero igualmente podrias utilizarlo en vb.net el detalle es defaultcellstyle que te cambia el format de la celda y te la convierte en este caso en currency(moneda), igualmente podrias cambiarla a moneda con simbole de $ o la que quieras,

    aqui encontraras mas info al respect https://msdn.microsoft.com/library/f9x2790s(v=vs.100).aspx

    exito

    domingo, 13 de diciembre de 2015 23:23
  • Hola Efrain

    Eso lo tenia mas o menos claro, de hecho probando  aqui y alla el siguiente codigo dá formato y alinea a la derecha a TODA la rejilla:

    For Each row As DataGridViewRow In Me.Grilla.Rows
                Grilla.DefaultCellStyle.Format = "C"
                Grilla.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            Next


    Lo que busco es que formatee solo las celdas con valores declarados Decimal (dinero)

    Esto deberia funcionar pero no lo hace

    For Each row As DataGridViewRow In Me.Grilla.Rows
                For Each col As DataGridViewCell In row.Cells
                    If col.ValueType = Type.GetType("System.Decimal") Then
                        col.Value = Format(col.Value, "C")
                    End If
                Next
            Next
    La linea en negrita lanza el error: System exception: 1,60 € no es un valor valido para Decimal.




    • Editado DiegC lunes, 14 de diciembre de 2015 10:54
    lunes, 14 de diciembre de 2015 1:59
  • DiegC yo pienso a base de lo que me has dicho que lo major que te conviene es darle format al numero desde el datatable que te trae los datos a un datagrid, recuerda algo importante, un datagridview es un contenedor que hace basicamente lo mismo que un textbox, osea sirve para visualizer datos, a mi entender lo mas sensate seria darle format al dato que traes a tu datagridview desde el mismo datatable, por que como podria un datagridview definer que tipo de dato va a entrar a ella.......
    lunes, 14 de diciembre de 2015 15:21
  • Me.mtbfechanacimiento.Text = String.Format("{0:MM\/dd\/yyyy}", row.Cells("Fecha_Nacimiento").Value)

    esto es un ejemplo de como yo le doy format a un dato que viene de un datagridview a un textbox, seria basicamente la misma  cosa para ti, lo unico que utilizarias los rows de un datatable y le darias un format antes de volcarlo en el datagridview
    lunes, 14 de diciembre de 2015 15:30
  • hola

    Cómo: Dar formato a datos en el control DataGridView de formularios Windows Forms

    >>pero se me ocurre que se podria hacer con un bucle que detecte el tipo de dato y actue en consecuencia

    porque un bucle ? el formato lo asignas a la columna, la cual debe ser de un tipo en concreto

    recuerda que el origen de datos que asignes al grid debe respectar el tipo de datos, o sea si defines na columna como numerica la propiedad o columnas del datatable o clase que asignes debe ser numerico para que aplique el formato

    si defines una columna string en la columna no aplicara ningun formato

    saldos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 14 de diciembre de 2015 21:48
  • La idea era hacer una rutina que se pudiese aplicar a todas las grillas que arrastramos a los formularios en vez de hacerlo una a una.

    Lo que dice Leandro lo tenia claro, y lo que sugiere Efrain no nos ahorraria ningun trabajo, ya que cada datatable es distinto. Si os molestais en correr las lineas de codigo que he adjuntado, comprobareis que 

    la linea del condicional, detecta perfectamente que el dato es Decimal, pero cuando le aplica el formato a la celda salta el error. Y no se porque, porque esa linea  no da ningun error de sintaxis, aunque es como lo habria hecho en VB6 y puede que ahi radique el error. 

    En fin, a lo mejor no es tan facil como pensaba

    martes, 15 de diciembre de 2015 11:01
  • Bueno, al final no se si es la forma mas ortodoxa de hacerlo pero funciona.

    Esta rutina formatea las columnas de una datagrid enlazada a datos que es lo que yo buscaba.

    With DataGridView1
                For filas As Integer = 0 To .RowCount - 1
                    For Col As Integer = 0 To .ColumnCount - 1
                        Select Case .Columns(Col).ValueType
                            Case Type.GetType("System.Decimal")
               .Columns(Col).DefaultCellStyle.Format = "c"
               .Columns(Col).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
               .Columns(Col).Width = 60
                            Case Type.GetType("System.String")
               .Columns(Col).Width = 150
                            Case Type.GetType("System.Int32")
                .Columns(Col).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
                .Columns(Col).Width = 60
                        End Select
                    Next Col
                Next filas
            End With

    Ahora para que realmente fuese util, habria que ponerla en un modulo y poder llamarla desde cualquier formulario.y eso de momento no se como se hace.

     


    • Editado DiegC martes, 15 de diciembre de 2015 18:47
    • Marcado como respuesta Karen MalagónModerator miércoles, 23 de diciembre de 2015 18:22
    martes, 15 de diciembre de 2015 18:44