none
Imprimir sólo columnas visibles en datagridview RRS feed

  • Pregunta

  • Hola a tod@s,

    Tengo un datagridview que tiene 8 columnas visibles y otras tantas invisibles (no visibles) pero a la hora de imprimir me imprime las visibles y las no visibles. ¿Cómo podría imprimir sólo las visibles?

    Este es el código que uso para imprimir:

    (VISTA PREVIA)

    Private Sub printDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint         Try             strFormat = New StringFormat             strFormat.Alignment = StringAlignment.Near             strFormat.LineAlignment = StringAlignment.Center             strFormat.Trimming = StringTrimming.EllipsisCharacter             arrColumnLefts.Clear()             arrColumnWidths.Clear()             iCellHeight = 0             iRow = 0             bNewPage = True             bFirstPage = True             iTotalWidth = 0             For Each dgGridCol As DataGridViewColumn In DataGridView1.Columns                 iTotalWidth += dgGridCol.Width             Next dgGridCol         Catch ex As Exception             MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error)         End Try     End Sub

    (IMPRIMIR)

    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage         Try             Dim iLefmargin As Integer = e.MarginBounds.Left             Dim iTopmargin As Integer = e.MarginBounds.Top             Dim bMorePagesToPrint As Boolean = False             Dim iTmpWidth As Integer = 0             If bFirstPage Then                 For Each Gridcol As DataGridViewColumn In DataGridView1.Columns                     iTmpWidth = CInt(Math.Truncate(Math.Floor(CDbl(CDbl(Gridcol.Width) / CDbl(iTotalWidth) * CDbl(iTotalWidth) * CDbl(e.MarginBounds.Width) / CDbl(iTotalWidth)))))                     iHeaderHeight = CInt(e.Graphics.MeasureString(Gridcol.HeaderText, Gridcol.InheritedStyle.Font, iTmpWidth).Height) + 11                     arrColumnLefts.Add(iLefmargin)                     arrColumnWidths.Add(iTmpWidth)                     iLefmargin += iTmpWidth                 Next Gridcol             End If             Do While iRow <= DataGridView1.Rows.Count - 1                 Dim GridRow As DataGridViewRow = DataGridView1.Rows(iRow)                 iCellHeight = GridRow.Height + 5                 Dim iCount As Integer = 0                 If iTopmargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top Then                     bNewPage = True                     bFirstPage = False                     bMorePagesToPrint = True                     Exit Do                 Else                     If bNewPage Then                         e.Graphics.DrawString("Listado General", New Font(DataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - e.Graphics.MeasureString("Datagridview Details", New Font(DataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13)                         Dim strDate As String = Date.Now.ToLongDateString & " " & Date.Now.ToShortTimeString                         e.Graphics.DrawString(strDate, New Font(DataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(strDate, New Font(DataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Top - e.Graphics.MeasureString("Datagridview Details", New Font(New Font(DataGridView1.Font, FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13)                         e.Graphics.DrawString("Total: " & Label2.Text, New Font(DataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Bottom - e.Graphics.MeasureString("Datagridview Details", New Font(DataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13)                         e.Graphics.DrawString("Baja: " & txt_Buscar1.Text, New Font(DataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(strDate, New Font(DataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Bottom - e.Graphics.MeasureString("Datagridview Details", New Font(New Font(DataGridView1.Font, FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13)                         'draw column                         iTopmargin = e.MarginBounds.Top                         For Each Gridcol As DataGridViewColumn In DataGridView1.Columns                             e.Graphics.FillRectangle(New SolidBrush(Color.LightGray), New Rectangle(DirectCast(arrColumnLefts(iCount), Integer), iTopmargin, DirectCast(arrColumnWidths(iCount), Integer), iHeaderHeight))                             e.Graphics.DrawRectangle(Pens.Black, New Rectangle(DirectCast(arrColumnLefts(iCount), Integer), iTopmargin, DirectCast(arrColumnWidths(iCount), Integer), iHeaderHeight))                             e.Graphics.DrawString(Gridcol.HeaderText, Gridcol.InheritedStyle.Font, New SolidBrush(Gridcol.InheritedStyle.ForeColor), New RectangleF(DirectCast(arrColumnLefts(iCount), Integer), iTopmargin, DirectCast(arrColumnWidths(iCount), Integer), iHeaderHeight), strFormat)                             iCount += 1                         Next Gridcol                         bNewPage = False                         iTopmargin += iHeaderHeight                     End If                     iCount = 0                     For Each cel As DataGridViewCell In GridRow.Cells                         If cel.Value IsNot Nothing Then                             e.Graphics.DrawString(cel.Value.ToString, cel.InheritedStyle.Font, New SolidBrush(cel.InheritedStyle.ForeColor), New RectangleF(DirectCast(arrColumnLefts(iCount), Integer), CSng(iTopmargin), DirectCast(arrColumnWidths(iCount), Integer), iHeaderHeight), strFormat)                         End If                         e.Graphics.DrawRectangle(Pens.Black, New Rectangle(DirectCast(arrColumnLefts(iCount), Integer), iTopmargin, DirectCast(arrColumnWidths(iCount), Integer), iCellHeight))                         iCount += 1                     Next cel                 End If                 iRow += 1                 iTopmargin += iCellHeight             Loop             If bMorePagesToPrint Then                 e.HasMorePages = True             Else                 e.HasMorePages = False             End If         Catch ex As Exception             MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)         End Try     End Sub

    (BOTÓN IMPRIMIR)

     Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click         Dim Print_Preview As New PrintPreviewDialog         Print_Preview.Document = PrintDocument1         Print_Preview.ShowDialog()     End Sub

    Mil gracias a tod@s por vuestra colaboración!!


    • Editado Andoniar78 viernes, 25 de enero de 2019 8:49
    viernes, 25 de enero de 2019 8:48

Todas las respuestas

  • Difícil de leer tu código tal como lo has puesto pero lo que tienes que hacer es controlar la propiedad Visible de las columnas:

     For Each Gridcol As DataGridViewColumn In DataGridView1.Columns 

        If Gridcol.Visible Then

            ....


    Saludos, Javier J

    viernes, 25 de enero de 2019 9:24
  • Hola después de más de un año. gracias por la respuesta antes de nada pero me di por vencido.
    Ahora he vuelto y me encuentro en la misma tesitura. El caso es que no sé dónde integrar la respuesta de Javier Jiménez (GRACIAS MILES POR LA AYUDA). tengo algo así:

    Private Sub printDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
            Try
                strFormat = New StringFormat
                strFormat.Alignment = StringAlignment.Near
                strFormat.LineAlignment = StringAlignment.Center
                strFormat.Trimming = StringTrimming.EllipsisCharacter

                arrColumnLefts.Clear()
                arrColumnWidths.Clear()
                iCellHeight = 0
                iRow = 0
                bNewPage = True
                bFirstPage = True

                iTotalWidth = 0

                For Each dgGridCol As DataGridViewColumn In DataGridView1.Columns
                    iTotalWidth += dgGridCol.Width

                Next dgGridCol
            Catch ex As Exception
                MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

    El problema es que si no pongo todas las columnas (dejando únicamente las que quiero imprimir) en el datagridview, al hacer doble click no me llena los campos de un formulario y me da este error:

    System.ArgumentOutOfRangeException: 'El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección.
    Nombre del parámetro: index'

    Pero si pongo todas las columnas (las que quiero imprimir y las que no) en el datagridview, al hacer doble click me rellena los campos del formulario pero al imprimir me imprime columnas que no me interesan...

    Alguna sugerencia?

    P.D. Soy autodidacta en esto! 

    MIL GRACIAS

    miércoles, 13 de mayo de 2020 11:24
  • Hola:
    En un Form como el de la imagen

    Copia y pega el sigiente codigo

    Imports System.Data.SqlClient
    Imports System.Drawing.Printing
    Public Class FrmPrintDocument
        Private MyDataGridViewPrinter As DataGridViewPrinter
        Private msCadConexion As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
        Private Sub FrmPrintDocument_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Try
                Using loConexion As New SqlConnection(msCadConexion)
                    Dim lsQuery As String = "Select ContactName, Address, City, Country, Phone From CUSTOMERS"
                    Using loDataAdapter As New SqlDataAdapter(lsQuery, loConexion)
                        Dim loDataTable As New DataTable
                        loDataAdapter.Fill(loDataTable)
                        MyDataGridView.DataSource = loDataTable
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show("Operation failed: " & ex.ToString(), Application.ProductName & " - Error", MessageBoxButtons.OK, MessageBoxIcon.[Error])
                Return
            End Try
            '
            MyDataGridView.ColumnHeadersDefaultCellStyle.Font = New Font("Tahoma", 9, FontStyle.Bold, GraphicsUnit.Point)
            MyDataGridView.ColumnHeadersDefaultCellStyle.BackColor = SystemColors.ControlDark
            MyDataGridView.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.[Single]
            MyDataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            MyDataGridView.DefaultCellStyle.Font = New Font("Tahoma", 8, FontStyle.Regular, GraphicsUnit.Point)
            MyDataGridView.DefaultCellStyle.BackColor = Color.Empty
            MyDataGridView.AlternatingRowsDefaultCellStyle.BackColor = SystemColors.ControlLight
            MyDataGridView.CellBorderStyle = DataGridViewCellBorderStyle.[Single]
            MyDataGridView.GridColor = SystemColors.ControlDarkDark
            '
            '
            'OOOOOOOJJJJJJJJJJJJJJJOOOOOOOOOOOOOO  PRUEBA DESMARCANDO LA SIGUIENTE LINEA
            'MyDataGridView.Columns("City").Visible = False
            '
            ' Cambio de la alineación de la última columna de estar en la alineación a la derecha
            MyDataGridView.Columns(MyDataGridView.Columns.Count - 1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            ' Ajuste de cada columna para mostrar el contenido, incluyendo la celda de encabezado
            MyDataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)
            Me.WindowState = FormWindowState.Maximized
        End Sub
        Private Sub btnImprimir_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnImprimir.Click
            If SetupThePrinting() Then
                MyPrintDocument.Print()
            End If
        End Sub
        Private Sub btnVPrevia_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnVPrevia.Click
            If SetupThePrinting() Then
                Dim MyPrintPreviewDialog As New PrintPreviewDialog()
                MyPrintPreviewDialog.Document = MyPrintDocument
                MyPrintPreviewDialog.ShowDialog()
            End If
        End Sub
        Private Sub MyPrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles MyPrintDocument.PrintPage
            Dim more As Boolean = MyDataGridViewPrinter.gF_bImprimeDataGridView(e.Graphics)
            If more = True Then
                e.HasMorePages = True
            End If
        End Sub
        Private Function SetupThePrinting() As Boolean
            Dim MyPrintDialog As New PrintDialog()
            MyPrintDialog.AllowCurrentPage = False
            MyPrintDialog.AllowPrintToFile = False
            MyPrintDialog.AllowSelection = False
            MyPrintDialog.AllowSomePages = False
            MyPrintDialog.PrintToFile = False
            MyPrintDialog.ShowHelp = False
            MyPrintDialog.ShowNetwork = False
            '
            If MyPrintDialog.ShowDialog() <> DialogResult.OK Then
                Return False
            End If
            '
            MyPrintDocument.DocumentName = "PRUEBA PRINTDOCUMENT"
            MyPrintDocument.PrinterSettings = MyPrintDialog.PrinterSettings
            MyPrintDocument.DefaultPageSettings = MyPrintDialog.PrinterSettings.DefaultPageSettings
            MyPrintDocument.DefaultPageSettings.Margins = New Margins(40, 40, 40, 40)
            '
            If MessageBox.Show("Quieres que el informe que se centra en la página", "Centrar en Pagina", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
                MyDataGridViewPrinter = New DataGridViewPrinter(MyDataGridView, MyPrintDocument, True, True, "Listado de :::::::::", New Font("Tahoma", 18, FontStyle.Bold, GraphicsUnit.Point), Color.Black, True)
            Else
                MyDataGridViewPrinter = New DataGridViewPrinter(MyDataGridView, MyPrintDocument, False, True, "Listado de .........", New Font("Tahoma", 18, FontStyle.Bold, GraphicsUnit.Point), Color.Black, True)
            End If
            Return True
        End Function
    End Class

    Hace uso de la siguiente clase

    Imports System.Drawing.Printing
    Public Class DataGridViewPrinter
        Private mDataGridView As DataGridView
        ' El control DataGridView que se imprimirá
        Private mPrintDocument As PrintDocument
        ' El PrintDocument que se utilizará para la impresión
        Private mbPaginaCentrada As Boolean
        ' Determina si el informe se imprimirá en la parte superior central de la página
        Private mbTitulo As Boolean
        ' Determina si la página contiene el texto del título
        Private msTitulo As String
        ' El texto del título se va a imprimir en cada página (si mbTitulo se establece en true)
        Private mFontTitulo As Font
        ' El tipo de letra para ser utilizado con el texto del título (si mbTitulo se establece en true)
        Private mColorTitulo As Color
        ' El color para ser utilizado con el texto del título (si mbTitulo se establece en true)
        Private mbPaginacion As Boolean
        ' Determina si se utiliza la paginación
        Shared miFilaActual As Integer
        ' Para saber la que la fila (en el control DataGridView) que se debe imprimir
        Shared miNumPagina As Integer
        '
        Private miAltoPagina As Integer
        Private miAnchoPagina As Integer
        Private miMargenIzda As Integer
        Private miMargenArriba As Integer
        Private miMargenDcha As Integer
        Private miMargenAbajo As Integer
        '
        Private msPosY As Single
        ' Para saber la coordenada de la página, el siguiente objeto que se deba imprimir partir de esta coordenada
        Private msAnchoCabFila As Single
        Private mlsAnchoFila As List(Of Single)
        Private mlsAnchoColumna As List(Of Single)
        Private msAnchoDataGridView As Single
        '
        ' Lista de arranque / parada puntos para la columna de impresión
        ' Esto será utilizado en situaciones donde el DataGridView no caben en una sola página
        Private mliPuntoColumna As List(Of Integer())
        Private mlsAnchoPuntoColumna As List(Of Single)
        Private miPuntoColumna As Integer
        '
        Public Sub New(ByVal aDataGridView As DataGridView, ByVal aPrintDocument As PrintDocument, ByVal PaginaCentrada As Boolean, ByVal Titulo As Boolean, ByVal TextoTitulo As String, ByVal FontTitulo As Font, ByVal ColorTitulo As Color, ByVal Paginacion As Boolean)
            mDataGridView = aDataGridView
            mPrintDocument = aPrintDocument
            mbPaginaCentrada = PaginaCentrada
            mbTitulo = Titulo
            msTitulo = TextoTitulo
            mFontTitulo = FontTitulo
            mColorTitulo = ColorTitulo
            mbPaginacion = Paginacion
            '
            miNumPagina = 0
            '
            mlsAnchoFila = New List(Of Single)()
            mlsAnchoColumna = New List(Of Single)()
            '
            mliPuntoColumna = New List(Of Integer())()
            mlsAnchoPuntoColumna = New List(Of Single)()
            ' Calculo dee PageWidth y PageHeight
            If Not mPrintDocument.DefaultPageSettings.Landscape Then
                miAltoPagina = mPrintDocument.DefaultPageSettings.PaperSize.Width
                miAnchoPagina = mPrintDocument.DefaultPageSettings.PaperSize.Height
            Else
                miAnchoPagina = mPrintDocument.DefaultPageSettings.PaperSize.Width
                miAltoPagina = mPrintDocument.DefaultPageSettings.PaperSize.Height
            End If
            ' Calculo de margenes de pagina
            miMargenIzda = mPrintDocument.DefaultPageSettings.Margins.Left
            miMargenArriba = mPrintDocument.DefaultPageSettings.Margins.Top
            miMargenDcha = mPrintDocument.DefaultPageSettings.Margins.Right
            miMargenAbajo = mPrintDocument.DefaultPageSettings.Margins.Bottom
            ' La fila actual que se va a imprimir es la primera fila del control DataGridView
            miFilaActual = 0
        End Sub
        ' El procedimiento calcula la altura de cada fila (incluyendo la cabecera), el ancho de cada columna (de acuerdo con el texto más largo en todas sus células, incluidas la celda de encabezado), y todo el ancho de DataGridView
        Private Sub lP_Calculate(ByVal grafico As Graphics)
            If miNumPagina = 0 Then
                ' Just calculate once
                Dim lTmpSize As New SizeF()
                Dim lTmpFont As Font
                Dim lTmpWidth As Single
                '
                msAnchoDataGridView = 0
                For liColumna As Integer = 0 To mDataGridView.Columns.Count - 1
                    lTmpFont = mDataGridView.ColumnHeadersDefaultCellStyle.Font
                    If lTmpFont Is Nothing Then
                        ' Si no hay un estilo especial HeaderFont, utilizar el estilo predeterminado de fuente DataGridView
                        lTmpFont = mDataGridView.DefaultCellStyle.Font
                    End If
                    '
                    lTmpSize = grafico.MeasureString(mDataGridView.Columns(liColumna).HeaderText, lTmpFont)
                    lTmpWidth = lTmpSize.Width
                    msAnchoCabFila = lTmpSize.Height
                    '
                    For liFila As Integer = 0 To mDataGridView.Rows.Count - 1
                        lTmpFont = mDataGridView.Rows(liFila).DefaultCellStyle.Font
                        If lTmpFont Is Nothing Then
                            ' Si no hay estilo de fuente especial de la CurrentRow, utiliza la opción por defecto asociado con el control DataGridView
                            lTmpFont = mDataGridView.DefaultCellStyle.Font
                        End If
                        '
                        lTmpSize = grafico.MeasureString("Anything", lTmpFont)
                        mlsAnchoFila.Add(lTmpSize.Height)
                        '
                        lTmpSize = grafico.MeasureString(mDataGridView.Rows(liFila).Cells(liColumna).EditedFormattedValue.ToString(), lTmpFont)
                        If lTmpSize.Width > lTmpWidth Then
                            lTmpWidth = lTmpSize.Width
                        End If
                    Next
                    If mDataGridView.Columns(liColumna).Visible Then
                        msAnchoDataGridView += lTmpWidth
                    End If
                    mlsAnchoColumna.Add(lTmpWidth)
                Next
                ' Definir el inicio / parada de puntos columna basada en el ancho de página y el Ancho DataGridView
                ' Vamos a usar esto para determinar las columnas que se señalan en cada página
                ' Se determinada el número máximo de columnas de una página
                Dim liPuntoInicial As Integer = 0
                For liFila As Integer = 0 To mDataGridView.Columns.Count - 1
                    If mDataGridView.Columns(liFila).Visible Then
                        liPuntoInicial = liFila
                        Exit For
                    End If
                Next
                '
                Dim liPuntoFinal As Integer = mDataGridView.Columns.Count
                For liColumna As Integer = mDataGridView.Columns.Count - 1 To 0 Step -1
                    If mDataGridView.Columns(liColumna).Visible Then
                        liPuntoFinal = liColumna + 1
                        Exit For
                    End If
                Next
                '
                Dim lsAnchoTemp As Single = msAnchoDataGridView
                Dim lsAreaImpresion As Single = CSng(miAltoPagina) - CSng(miMargenIzda) - CSng(miMargenDcha)
                ' Si el ancho total de DataGridView es más grande que el área de impresión
                If msAnchoDataGridView > lsAreaImpresion Then
                    lsAnchoTemp = 0.0F
                    For liColumna As Integer = 0 To mDataGridView.Columns.Count - 1
                        If mDataGridView.Columns(liColumna).Visible Then
                            lsAnchoTemp += mlsAnchoColumna(liColumna)
                            ' Si la anchura es mayor que el área de la página, definir una nueva columna de impresión
                            If lsAnchoTemp > lsAreaImpresion Then
                                lsAnchoTemp -= mlsAnchoColumna(liColumna)
                                mliPuntoColumna.Add(New Integer() {liPuntoInicial, liPuntoFinal})
                                mlsAnchoPuntoColumna.Add(lsAnchoTemp)
                                liPuntoInicial = liColumna
                                lsAnchoTemp = mlsAnchoColumna(liColumna)
                            End If
                        End If
                        ' El índice es uno por encima del índice actual
                        liPuntoFinal = liColumna + 1
                    Next
                End If
                ' Añade el último conjunto de columnas
                mliPuntoColumna.Add(New Integer() {liPuntoInicial, liPuntoFinal})
                mlsAnchoPuntoColumna.Add(lsAnchoTemp)
                miPuntoColumna = 0
            End If
        End Sub
        ' La funcion imprime el título, número de página, y la fila de encabezado
        Private Sub lP_Cabecera(ByVal grafico As Graphics)
            msPosY = CSng(miMargenArriba)
            ' Impresión del número de página (si mbPaginacion se establece en true)
            If mbPaginacion Then
                miNumPagina += 1
                Dim PageString As String = "Página " & miNumPagina.ToString()
                Dim PageStringFormat As New StringFormat()
                PageStringFormat.Trimming = StringTrimming.Word
                PageStringFormat.FormatFlags = StringFormatFlags.NoWrap Or StringFormatFlags.LineLimit Or StringFormatFlags.NoClip
                PageStringFormat.Alignment = StringAlignment.Far
                Dim PageStringFont As New Font("Tahoma", 8, FontStyle.Regular, GraphicsUnit.Point)
                Dim PageStringRectangle As New RectangleF(CSng(miMargenIzda), msPosY, CSng(miAltoPagina) - CSng(miMargenDcha) - CSng(miMargenIzda), grafico.MeasureString(PageString, PageStringFont).Height)
                '
                grafico.DrawString(PageString, PageStringFont, New SolidBrush(Color.Black), PageStringRectangle, PageStringFormat)
                '
                msPosY += grafico.MeasureString(PageString, PageStringFont).Height
            End If
            ' Impresión del título (si mbTitulo se establece en true)
            If mbTitulo Then
                Dim TitleFormat As New StringFormat()
                TitleFormat.Trimming = StringTrimming.Word
                TitleFormat.FormatFlags = StringFormatFlags.NoWrap Or StringFormatFlags.LineLimit Or StringFormatFlags.NoClip
                If mbPaginaCentrada Then
                    TitleFormat.Alignment = StringAlignment.Center
                Else
                    TitleFormat.Alignment = StringAlignment.Near
                End If
                '
                Dim TitleRectangle As New RectangleF(CSng(miMargenIzda), msPosY, CSng(miAltoPagina) - CSng(miMargenDcha) - CSng(miMargenIzda), grafico.MeasureString(msTitulo, mFontTitulo).Height)
                '
                grafico.DrawString(msTitulo, mFontTitulo, New SolidBrush(mColorTitulo), TitleRectangle, TitleFormat)
                '
                msPosY += grafico.MeasureString(msTitulo, mFontTitulo).Height
            End If
            ' Cálculo de la coordenada x de partida
            Dim CurrentX As Single = CSng(miMargenIzda)
            If mbPaginaCentrada Then
                CurrentX += ((CSng(miAltoPagina) - CSng(miMargenDcha) - CSng(miMargenIzda)) - mlsAnchoPuntoColumna(miPuntoColumna)) / 2.0F
            End If
            '
            Dim HeaderForeColor As Color = mDataGridView.ColumnHeadersDefaultCellStyle.ForeColor
            If HeaderForeColor.IsEmpty Then
                ' Si no hay un estilo HeaderFore especiales, utilizar el estilo predeterminado de DataGridView
                HeaderForeColor = mDataGridView.DefaultCellStyle.ForeColor
            End If
            Dim HeaderForeBrush As New SolidBrush(HeaderForeColor)
            '
            Dim HeaderBackColor As Color = mDataGridView.ColumnHeadersDefaultCellStyle.BackColor
            If HeaderBackColor.IsEmpty Then
                ' Si no hay un estilo especial HeaderBack, utilizar el estilo predeterminado de DataGridView
                HeaderBackColor = mDataGridView.DefaultCellStyle.BackColor
            End If
            Dim HeaderBackBrush As New SolidBrush(HeaderBackColor)
            ' Ajuste de la LinePen que se utiliza para dibujar líneas y rectángulos (derivados de la propiedad GridColor del control DataGridView)
            Dim TheLinePen As New Pen(mDataGridView.GridColor, 1)
            '
            Dim HeaderFont As Font = mDataGridView.ColumnHeadersDefaultCellStyle.Font
            If HeaderFont Is Nothing Then
                ' Si no hay un estilo especial HeaderFont, utilizar el estilo predeterminado de fuente DataGridView
                HeaderFont = mDataGridView.DefaultCellStyle.Font
            End If
            ' Calcular y dibujar el HeaderBounds
            Dim HeaderBounds As New RectangleF(CurrentX, msPosY, mlsAnchoPuntoColumna(miPuntoColumna), msAnchoCabFila)
            grafico.FillRectangle(HeaderBackBrush, HeaderBounds)
            ' Formato que se utilizará para imprimir cada celda de la fila de encabezado
            Dim CellFormat As New StringFormat()
            CellFormat.Trimming = StringTrimming.Word
            CellFormat.FormatFlags = StringFormatFlags.NoWrap Or StringFormatFlags.LineLimit Or StringFormatFlags.NoClip
            ' Impresión de cada celda visible de la fila de encabezado
            Dim CellBounds As RectangleF
            Dim ColumnWidth As Single
            For i As Integer = CInt(mliPuntoColumna(miPuntoColumna).GetValue(0)) To CInt(mliPuntoColumna(miPuntoColumna).GetValue(1)) - 1
                If Not mDataGridView.Columns(i).Visible Then
                    Continue For
                End If
                ' Si la columna no es visible, pasar por alto esta iteración
                ColumnWidth = mlsAnchoColumna(i)
                ' Comprueba la alineación currentCell y se aplica a CellFormat
                If mDataGridView.ColumnHeadersDefaultCellStyle.Alignment.ToString().Contains("Right") Then
                    CellFormat.Alignment = StringAlignment.Far
                ElseIf mDataGridView.ColumnHeadersDefaultCellStyle.Alignment.ToString().Contains("Center") Then
                    CellFormat.Alignment = StringAlignment.Center
                Else
                    CellFormat.Alignment = StringAlignment.Near
                End If
                '
                CellBounds = New RectangleF(CurrentX, msPosY, ColumnWidth, msAnchoCabFila)
                ' Impresión del texto de la celda
                grafico.DrawString(mDataGridView.Columns(i).HeaderText, HeaderFont, HeaderForeBrush, CellBounds, CellFormat)
                ' Señalando a la celda de los límites
                If mDataGridView.RowHeadersBorderStyle <> DataGridViewHeaderBorderStyle.None Then
                    ' Dibujar el borde de la celda sólo si el HeaderBorderStyle no es None
                    grafico.DrawRectangle(TheLinePen, CurrentX, msPosY, ColumnWidth, msAnchoCabFila)
                End If
                '
                CurrentX += ColumnWidth
            Next
            msPosY += msAnchoCabFila
        End Sub
        ' La función que imprimir un montón de líneas que caben en una sola página
        ' Cuando se devuelve true, lo que significa que hay más filas aún no se imprime en otra acción PagePrint se requiere
        ' Cuando se devuelve false, lo que significa que todas las filas están impresas (el parámetro CureentRow alcanza la última fila del control DataGridView) y ninguna acción PagePrint se necesita más
        Private Function lP_Linea(ByVal grafico As Graphics) As Boolean
            ' Ajuste de la LinePen que se utiliza para dibujar líneas y rectángulos (derivados de la propiedad GridColor del control DataGridView)
            Dim lLapiz As New Pen(mDataGridView.GridColor, 1)
            ' Los parametros del estilo que se utiliza para imprimir cada celda
            Dim lRowFont As Font
            Dim lRowForeColor As Color
            Dim lRowBackColor As Color
            Dim lRowForeBrush As SolidBrush
            Dim lRowBackBrush As SolidBrush
            Dim lRowAlternatingBackBrush As SolidBrush
            ' Ajuste el formato que se utilizará para imprimir cada celda
            Dim CellFormat As New StringFormat()
            CellFormat.Trimming = StringTrimming.Word
            CellFormat.FormatFlags = StringFormatFlags.NoWrap Or StringFormatFlags.LineLimit
            ' Impresión de cada celda visible
            Dim lRectangulo As RectangleF
            Dim lsPosX As Single
            Dim lsAnchoColumna As Single
            While miFilaActual < mDataGridView.Rows.Count
                If mDataGridView.Rows(miFilaActual).Visible Then
                    ' Imprimir las células de la CurrentRow sólo si ese registro es visible
                    ' Establecer el estilo de fuente fila
                    lRowFont = mDataGridView.Rows(miFilaActual).DefaultCellStyle.Font
                    If lRowFont Is Nothing Then
                        ' Si el no hay estilo de fuente especial de la CurrentRow, a continuación, utilice la opción por defecto asociado con el control DataGridView
                        lRowFont = mDataGridView.DefaultCellStyle.Font
                    End If
                    ' Establecer el estilo RowFore
                    lRowForeColor = mDataGridView.Rows(miFilaActual).DefaultCellStyle.ForeColor
                    If lRowForeColor.IsEmpty Then
                        ' Si el estilo no hay RowFore especial de la CurrentRow, a continuación, utilice la opción por defecto asociado con el control DataGridView
                        lRowForeColor = mDataGridView.DefaultCellStyle.ForeColor
                    End If
                    lRowForeBrush = New SolidBrush(lRowForeColor)
                    ' Ajuste de la RowBack (para las filas pares) y el RowAlternatingBack (para las filas impares) estilos
                    lRowBackColor = mDataGridView.Rows(miFilaActual).DefaultCellStyle.BackColor
                    If lRowBackColor.IsEmpty Then
                        ' Si el no hay especial estilo RowBack del CurrentRow, a continuación, utilice la opción por defecto asociado con el control DataGridView
                        lRowBackBrush = New SolidBrush(mDataGridView.DefaultCellStyle.BackColor)
                        lRowAlternatingBackBrush = New SolidBrush(mDataGridView.AlternatingRowsDefaultCellStyle.BackColor)
                    Else
                        ' Si la hay un estilo especial de la RowBack CurrentRow, para luego usarla tanto para el RowBack y los estilos RowAlternatingBack
                        lRowBackBrush = New SolidBrush(lRowBackColor)
                        lRowAlternatingBackBrush = New SolidBrush(lRowBackColor)
                    End If
                    ' Cálculo de la coordenada x de partida que el proceso de impresión se iniciará a partir
                    lsPosX = CSng(miMargenIzda)
                    If mbPaginaCentrada Then
                        lsPosX += ((CSng(miAltoPagina) - CSng(miMargenDcha) - CSng(miMargenIzda)) - mlsAnchoPuntoColumna(miPuntoColumna)) / 2.0F
                    End If
                    ' Cálculo de la CurrentRow toda límites              
                    lRectangulo = New RectangleF(lsPosX, msPosY, mlsAnchoPuntoColumna(miPuntoColumna), mlsAnchoFila(miFilaActual))
                    ' Llenado de la parte posterior de la CurrentRow
                    If miFilaActual Mod 2 = 0 Then
                        grafico.FillRectangle(lRowBackBrush, lRectangulo)
                    Else
                        grafico.FillRectangle(lRowAlternatingBackBrush, lRectangulo)
                    End If
                    ' Impresión de cada celda visible de la CurrentRow              
                    For CurrentCell As Integer = CInt(mliPuntoColumna(miPuntoColumna).GetValue(0)) To CInt(mliPuntoColumna(miPuntoColumna).GetValue(1)) - 1
                        If Not mDataGridView.Columns(CurrentCell).Visible Then
                            Continue For
                        End If
                        ' Si la célula es pertenecer a la columna invisible, pasar por alto esta iteración
                        ' Compruebe la alineación currentCell y aplicarlo a la CellFormat
                        If mDataGridView.Columns(CurrentCell).DefaultCellStyle.Alignment.ToString().Contains("Right") Then
                            CellFormat.Alignment = StringAlignment.Far
                        ElseIf mDataGridView.Columns(CurrentCell).DefaultCellStyle.Alignment.ToString().Contains("Center") Then
                            CellFormat.Alignment = StringAlignment.Center
                        Else
                            CellFormat.Alignment = StringAlignment.Near
                        End If
                        '
                        lsAnchoColumna = mlsAnchoColumna(CurrentCell)
                        Dim CellBounds As New RectangleF(lsPosX, msPosY, lsAnchoColumna, mlsAnchoFila(miFilaActual))
                        ' Impresión del texto de la celda
                        grafico.DrawString(mDataGridView.Rows(miFilaActual).Cells(CurrentCell).EditedFormattedValue.ToString(), lRowFont, lRowForeBrush, CellBounds, CellFormat)
                        ' Señalando a la celda de los límites
                        If mDataGridView.CellBorderStyle <> DataGridViewCellBorderStyle.None Then
                            ' Draw the cell border only if the CellBorderStyle is not None
                            grafico.DrawRectangle(lLapiz, lsPosX, msPosY, lsAnchoColumna, mlsAnchoFila(miFilaActual))
                        End If
                        lsPosX += lsAnchoColumna
                    Next
                    msPosY += mlsAnchoFila(miFilaActual)
                    ' Verificando si el CurrentY es superior a las límites página
                    ' Si es así, salir de la función y devolver verdadero significado otra acción PagePrint se requiere
                    If CInt(msPosY) > (miAnchoPagina - miMargenArriba - miMargenAbajo) Then
                        miFilaActual += 1
                        Return True
                    End If
                End If
                miFilaActual += 1
            End While
            miFilaActual = 0
            miPuntoColumna += 1
            ' Continuar para imprimir el siguiente grupo de columnas
            If miPuntoColumna = mliPuntoColumna.Count Then
                ' Lo que significa que todas las columnas se imprimen
                miPuntoColumna = 0
                Return False
            Else
                Return True
            End If
        End Function
        ' El método que llama a todas las demás funciones
        Public Function gF_bImprimeDataGridView(ByVal grafico As Graphics) As Boolean
            Try
                lP_Calculate(grafico)
                lP_Cabecera(grafico)
                Dim bContinue As Boolean = lP_Linea(grafico)
                Return bContinue
            Catch ex As Exception
                MessageBox.Show("Operacion arrónea: " & ex.Message.ToString(), Application.ProductName & " - Error", MessageBoxButtons.OK, MessageBoxIcon.[Error])
                Return False
            End Try
        End Function
    End Class

    Espero que te sea de utilidad

    Un saludo desde Bilbo
    Carlos
    miércoles, 13 de mayo de 2020 17:45
  • hola Carlos, gracias por tú ayuda pero ahí tendría que modificar mucho y no me aclaro, como he indicado soy autodidacta en esto de la programación jeje. He intentado hacerlo pero no me va :(

    ese es el escenario que tengo y claro, lo del dgv es lo visible pero al imprimir me salen todos los datos del trabajador :(

    MIL GRACIAS POR la colaboración.

    • Editado Andoniar78 jueves, 14 de mayo de 2020 8:45
    jueves, 14 de mayo de 2020 8:42

    • Editado Andoniar78 jueves, 14 de mayo de 2020 8:44
    jueves, 14 de mayo de 2020 8:44
  • Hola:
    ¿Has probado el ejemplo tal como esta?

    El ejemplo lo que hace es hacer una consulta (Select ContactName, Address, City, Country, Phone From CUSTOMERS) contra la base de datos Northwind.
    El datatable resultado de esa consulta lo visualiza en en DataGridView.
    Luego tiene 1 boton para la vista previa y 1 boton para imprimir.
    Ambos botones hacen uso de la clase DataGridViewPrinter

    Para usarlo en tu caso, lo unico que cambia es la consulta, lo demas es igual.

    Un saludo desde Bilbo
    Carlos
    jueves, 14 de mayo de 2020 10:14
  • Mmmmmm lo probaré a ver qué tal. Iré informando.

    MIL GRACIAS.

    viernes, 15 de mayo de 2020 12:15
  • Hola!!

    Nada, no me aclaro. Sorry :( ya te digo que soy autodidacta y no tengo ni idea... he construido el soft poco a poco y con retales de prueba y error.

    lunes, 18 de mayo de 2020 7:52
  • Hola:
    ¿Has probado el ejemplo tal como esta?

    Lo primero que tienes que hacer es probar el ejemplo poniendo puntos de interrupción para que vea como lo esta haciendo.

    Asi aprendes como se va ejecutando y una vez que lo tengas claro, lo modificas para tu caso

    Un saludo desde Bilbo

    Carlos

    lunes, 18 de mayo de 2020 9:31
  • Aupa; sí, lo he puesto tal y como está y no sé porque me da errores... :(
    martes, 19 de mayo de 2020 6:13
  • Hola:
    >  lo he puesto tal y como está y no sé porque me da errores <
    ¿Donde te da errores?
    Este ejemplo tiene varios años de existencia y siempre ha funcionado bien.
    Te muestro una imagenes que te tienen que salir al ejecutar el ejemplo
    Al abrir el Form en el evento Load

    Al hacer click en el boton Vista Previa

    Al hacer click en el boton Aceptar

    Al hacer click en el boton Si


    Un saludo desde Bilbo
    Carlos
    martes, 19 de mayo de 2020 7:23
  • Que mi proyecto sea VB net tiene algo que ver?

    GRACIAS

    martes, 19 de mayo de 2020 10:53
  • Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
    Error BC30002 No está definido el tipo 'DataGridViewPrinter'. WindowsApp3 C:\Users\Ando\source\repos\WindowsApp3\WindowsApp3\Form1.vb 4 Activo
    martes, 19 de mayo de 2020 11:29