none
Doble click DATAGRIDVIEW y carga de datos RRS feed

  • Pregunta

  • Hola a tod@s!!

    Tengo una tabla datagridview. Al hacer doble click en un registro me carga los datos de esa linea del datagridview en el formulario pero me sale 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'

    Es cierto que en el datagridview no quiero que aparezcan todos los registros del formulario. Si pongo todos los registros funciona correctamente pero a la hora de imprimir salen todos los registros y no los necesito y es cuando quito registros del tablagridview donde me da ese error!

    Esto es lo que uso para hacer la garga:

    Private Sub DataGridView1_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellDoubleClick
            Dim f2 As New Form2
            f2.txt_EmpNo.Text = DataGridView1.CurrentRow.Cells(0).Value.ToString()
            f2.txt_EmpName.Text = DataGridView1.CurrentRow.Cells(1).Value.ToString()
            f2.txt_Apellidos.Text = DataGridView1.CurrentRow.Cells(2).Value.ToString()
            f2.txt_Direccion.Text = DataGridView1.CurrentRow.Cells(3).Value.ToString()
            f2.txt_Poblacion.Text = DataGridView1.CurrentRow.Cells(4).Value.ToString()
            f2.txt_Provincia.Text = DataGridView1.CurrentRow.Cells(5).Value.ToString()
            f2.txt_CP.Text = DataGridView1.CurrentRow.Cells(6).Value.ToString()
            f2.txt_Pais.Text = DataGridView1.CurrentRow.Cells(7).Value.ToString()
            f2.txt_Telefono.Text = DataGridView1.CurrentRow.Cells(8).Value.ToString()
            f2.txt_Movil.Text = DataGridView1.CurrentRow.Cells(9).Value.ToString()
            f2.txt_Barco.Text = DataGridView1.CurrentRow.Cells(10).Value.ToString()
            f2.txt_Puesto.Text = DataGridView1.CurrentRow.Cells(11).Value.ToString()
            f2.Embarque.Text = DataGridView1.CurrentRow.Cells(12).Value.ToString()
            f2.Desembarque.Text = DataGridView1.CurrentRow.Cells(13).Value.ToString()
            f2.txt_Embarcado.Text = DataGridView1.CurrentRow.Cells(14).Value.ToString()
            f2.txt_Comentarios.Text = DataGridView1.CurrentRow.Cells(15).Value.ToString()
            f2.Baja2.Text = DataGridView1.CurrentRow.Cells(16).Value.ToString()
            f2.txt_Extranjero.Text = DataGridView1.CurrentRow.Cells(17).Value.ToString()
            f2.Baja.Text = DataGridView1.CurrentRow.Cells(18).Value.ToString()

            f2.Show()
            f2.txt_EmpNo.Enabled = True
            f2.txt_EmpName.Enabled = True
            f2.txt_Apellidos.Enabled = True
            f2.txt_Direccion.Enabled = True
            f2.txt_Poblacion.Enabled = True
            f2.txt_Provincia.Enabled = True
            f2.txt_CP.Enabled = True
            f2.txt_Pais.Enabled = True
            f2.txt_Telefono.Enabled = True
            f2.txt_Movil.Enabled = True
            f2.txt_Barco.Enabled = True
            f2.txt_Puesto.Enabled = True
            f2.txt_Embarcado.Enabled = True
            f2.txt_Comentarios.Enabled = True
            f2.Embarque.Enabled = True
            f2.Desembarque.Enabled = True
            f2.Fecha1_btn.Enabled = True
            f2.Fecha2_btn.Enabled = True
            f2.Fecha3_btn.Enabled = True
            f2.Baja.Enabled = True
            f2.Baja2.Enabled = True
            f2.txt_Extranjero.Enabled = True
            f2.Calendario1.Enabled = True
            f2.Calendario2.Enabled = True
            f2.Calendario3.Enabled = True
            f2.Nuevo_btn.Enabled = False
            f2.Guardar_btn.Enabled = False
            f2.Actualizar_btn.Enabled = True
            f2.Borrar_btn.Enabled = True
            f2.Cancelar_btn.Enabled = True
            Me.Hide()
        End Sub

    Alguien que pueda echarme un cable por favor?

    GRACIAS A TOD@S POR VUESTRA COLABORACIÓN!!!



    • Editado Andoniar1978 miércoles, 19 de diciembre de 2018 15:30
    miércoles, 19 de diciembre de 2018 15:23

Respuestas

  • Hola:
    Te expongo un ejemplo de imprimir un DataGridview con PrintDocument.
    Lo adaptas a tus necesidades

    El Form es como el de la imagen

    La imagen de proyecto es la siguiente

    Copia y pega el siguiente codigo

    Option Explicit On
    Option Strict On
    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"
                    Dim loDataAdapter As New SqlDataAdapter(lsQuery, loConexion)
                    Dim loDataTable As New DataTable
                    loDataAdapter.Fill(loDataTable)
                    MyDataGridView.DataSource = loDataTable
                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
            '
            '
            '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
    Se 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

    P.D.
    Espero que te sea de utilidad

    En la imagen del Form, NO aparece 1 control PrintDocument llamado MyPrintDocument

    Un saludo desde Bilbo
    Carlos



    viernes, 28 de diciembre de 2018 21:31

Todas las respuestas

  • Hola  Andoniar1978

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que estaremos realizando una revisión a profundidad acerca del inconveniente que se te está presentando.

    Proporcionaremos una respuesta lo más pronto posible.

    Gracias por usar los foros de MSDN.

    Pedro Alfaro
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
    miércoles, 19 de diciembre de 2018 17:48
    Moderador
  • Hola:
    Prueba con algo como esto
     

       Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            If e.RowIndex = -1 Then
                Return
            End If
            Dim loFila As DataGridViewRow = Me.DataGridView1.CurrentRow()

            Using loForm As New Form2
                loForm.Fila = loFila
                loForm.ShowDialog()
            End Using
        End Sub

    En el Form2

    Public Class Form2
        Private mFila As DataGridViewRow
        Public Property Fila() As DataGridViewRow
            Get
                Return mFila
            End Get
            Set(ByVal value As DataGridViewRow)
                mFila = value
            End Set
        End Property

        Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            txt_EmpNo.Text = mFila.Cells("EmpNo").Value.ToString
            txt_EmpName.Text = mFila.Cells("EmpName").Value.ToString
            txt_Apellidos.Text = mFila.Cells("Apellidos").Value.ToString
            'LOS DEMAS CONTROLES

            txt_EmpNo.Enabled = True
            txt_EmpName.Enabled = True
            txt_Apellidos.Enabled = True
            'LOS DEMAS CONTROLES
        End Sub
    End Class

           
    Un saludo desde Bilbo
    Carlos


    miércoles, 19 de diciembre de 2018 21:49
  • Hola!! gracias a tod@s por vuestra ayuda

    Carlos! otro saludo de Bilbo ;-) y gracias por tu ayuda aunque me da este error:

    System.NullReferenceException: 'Referencia a objeto no establecida como instancia de un objeto.'

    MIL GRACIAS

    jueves, 20 de diciembre de 2018 12:20
  • Hola!

    El caso es que si quito a partir de f2.txt_Telefono.Text = DataGridView1.CurrentRow.Cells("Teléfono").Value.ToString()

    hasta 

    f2.Baja.Text = DataGridView1.CurrentRow.Cells(18).Value.ToString()

    Me funciona y a partir de ahí es donde no funciona!!

    GRACIAS


    jueves, 20 de diciembre de 2018 12:48

  • El problema es que en el datagridview solo tengo 8 datos de todos esos que aparecen arriba con lo cúal la 9 es la del teléfono y por eso da error. El problema es que si añado todas las casillas y aunque las oculte (en las propiedades del datagridview) a la hora de imprimir me imprime todo (incluso las ocultas) y sólo quiero que me imprima las 8 casillas que tengo en el datagridview.

    igual tengo que modificar el código para imprimir, no?

    GRACIAS A TOD@S

    jueves, 20 de diciembre de 2018 14:51
  • Hola:
    ¿Puedes poner la estructura de la tabla, o la consulta con la que cargas el DataGridView?

    ¿Puedes poner que valores quieres imprimir?

    Un saludo desde Bilbo
    Carlos

    jueves, 20 de diciembre de 2018 20:12
  • En la tabla quiero que salga Número - Nombre - Apellidos - País - Barco - Puesto - Embarcado y Baja pero para que me imprima y no me de el error del otro dia tengo que ocultar todos los demás campos:

    EmpNo (Número - visible)
    EmpName (Nombre - Visible)
    Apellidos (Apellidos - Visible)
    Direccion (Dirección - Oculto)
    Poblacion (Población - Oculto)
    Provincia (Provincia - Oculto)
    CP (CP - Oculto)
    Pais ( País - Visible)
    Telefono (Teléfono - Oculto)
    Movil (Móvil - Oculto)
    Barco (Barco - Visible)
    Puesto (Puesto - Visible)
    Embarque (Embarque - Oculto)
    Desembarque (Desembarque - Oculto)
    Embarcado (Embarcado - Visible)
    Comentarios (Comentarios - Oculto)
    Baja2 (Baja - Visible)
    Extranjero (Extranjero - Oculto)
    Baja (Fecha - Oculto)

    Sólo quiero imprimir los que están visibles en el datagridview y este es el código que uso para 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

    Eskerrik asko Carlos!!!!

    MIL GRACIAS A TOD@S!!! 


    • Editado Andoniar1978 viernes, 21 de diciembre de 2018 7:38
    viernes, 21 de diciembre de 2018 7:35
  • Hola:
    Si solo quieres imprimir las columnas que son visible=true, cuando vas a tratar una columna lo primero que tienes que hacer es ver si esa columna tiene visible a true, si no es asi, no se hace nada, si es visible haces el tratamiento para esa columna.

    Un saludo desde Bilbo
    Carlos

    viernes, 21 de diciembre de 2018 7:51
  • Hola Carlos.

    Pero eso lo hago desde el datagridview, en las propiedades de la columna pongo si es visible o no.
    Te dejo el enlace de las fotos (porque aquí no me deja subir)

    Foto columnas

    Vista previa impresión (aparecen todas las columnas. Visibles y no visibles)

    Arriba ves las visibles y lo que únicamente quiero que se imprima y en las propiedades están todas. Visibles y ocultas!

    MIL GRACIAS POR TÚ AYUDA CARLOS

    Mil gracias a tod@s!




    • Editado Andoniar1978 sábado, 22 de diciembre de 2018 11:37
    sábado, 22 de diciembre de 2018 11:31
  • Hola:
    En un form con 1 DataGridView, copia y pega el siguiente código

    Option Strict On
    Option Explicit On
    Imports System.Data.OleDb
    Public Class Form1
        Private msCadenaACCESS As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\prueba.accdb"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Try
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Dim lsQuery As String = "Select * From MiTabla"
                    Using loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                        Dim loDataTable As New DataTable
                        loDataAdapter.Fill(loDataTable)
                        Me.DataGridView1.DataSource = loDataTable
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Load", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
            ' estilo para la cabecera
            Dim styCabecera As DataGridViewCellStyle
            styCabecera = New DataGridViewCellStyle()
            styCabecera.BackColor = Color.LightBlue
            styCabecera.ForeColor = Color.DarkOliveGreen
            styCabecera.Font = New Font("Bradley Hand ITC", 10, FontStyle.Bold)
            styCabecera.Alignment = DataGridViewContentAlignment.BottomCenter
            Me.DataGridView1.ColumnHeadersDefaultCellStyle = styCabecera
            ' estilo principal para todas las celdas
            Dim styEstilo As DataGridViewCellStyle
            styEstilo = New DataGridViewCellStyle()
            styEstilo.BackColor = Color.LightYellow
            styEstilo.ForeColor = Color.DarkViolet
            styEstilo.Font = New Font("Arial", 10, FontStyle.Bold)
            styEstilo.Alignment = DataGridViewContentAlignment.TopCenter
            styEstilo.NullValue = "VALOR NULO"
            styEstilo.SelectionBackColor = Color.DarkGreen
            styEstilo.SelectionForeColor = Color.LightSkyBlue
            styEstilo.WrapMode = DataGridViewTriState.[True]
            Me.DataGridView1.DefaultCellStyle = styEstilo
            ' estilo para las filas alternas
            Dim styAlterno As DataGridViewCellStyle
            styAlterno = New DataGridViewCellStyle()
            styAlterno.BackColor = Color.LightGray
            styAlterno.ForeColor = Color.BlueViolet
            styAlterno.Font = New Font("Courier New", 10, FontStyle.Bold)
            styAlterno.NullValue = "VALOR NULO"
            Me.DataGridView1.AlternatingRowsDefaultCellStyle = styAlterno
            Me.DataGridView1.Columns("Direccion").Visible = False
            Me.DataGridView1.Columns("Poblacion").Visible = False
            Me.DataGridView1.Columns("Provincia").Visible = False
            Me.DataGridView1.Columns("CP").Visible = False
            Me.DataGridView1.Columns("Telefono").Visible = False
            Me.DataGridView1.Columns("Movil").Visible = False
            Me.DataGridView1.Columns("Embarque").Visible = False
            Me.DataGridView1.Columns("Desembarque").Visible = False
            Me.DataGridView1.Columns("Comentarios").Visible = False
            Me.DataGridView1.Columns("Extranjero").Visible = False
            Me.DataGridView1.Columns("Baja").Visible = False
            Me.WindowState = FormWindowState.Maximized
        End Sub
        Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            If e.RowIndex = -1 Then
                Return
            End If
            Dim loFila As DataGridViewRow = Me.DataGridView1.CurrentRow()
            Using loForm As New Form2
                loForm.Fila = loFila
                loForm.ShowDialog()
            End Using
        End Sub
    End Class

    En un Form con 3 TextBox, copia y pega el siguiente codigo

    Public Class Form2
        Private mFila As DataGridViewRow
        Public Property Fila() As DataGridViewRow
            Get
                Return mFila
            End Get
            Set(ByVal value As DataGridViewRow)
                mFila = value
            End Set
        End Property
        Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            txt_EmpNo.Text = Convert.ToString(mFila.Cells("EmpNo").Value)
            txt_EmpName.Text = Convert.ToString(mFila.Cells("EmpName").Value)
            txt_Apellidos.Text = Convert.ToString(mFila.Cells("Apellidos").Value)
            '
            txt_EmpNo.Enabled = True
            txt_EmpName.Enabled = True
            txt_Apellidos.Enabled = True
        End Sub
    End Class

    Un saludo desde Bilbo

    Carlos

    sábado, 22 de diciembre de 2018 23:01
  • Hola:

    Despues de estas lineas

                Do While iRow <= DataGridView1.Rows.Count - 1
                    Dim GridRow As DataGridViewRow = DataGridView1.Rows(iRow)

    Tienes que preguntar si es una columna visible

                    For liCiclo As Integer = 0 To GridRow.Cells.Count - 1
                        If GridRow.Cells(liCiclo).Visible = True Then
                            'TRATAMIENTO PARA IMPRIMIR
                        End If
                    Next

    P.D.
    Espero que se entienda

    Un saludo desde Bilbo
    Carlos

    sábado, 22 de diciembre de 2018 23:02
  • Hola Carlos, ante todo agradecer tu gran ayuda y colaboración pero me surgen un par de dudas. Con el primer código
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Try
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Dim lsQuery As String = "Select * From MiTabla"
                    Using loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                        Dim loDataTable As New DataTable
                        loDataAdapter.Fill(loDataTable)
                        Me.DataGridView1.DataSource = loDataTable
                    End Using
                End Using

    Con esto me cargaría los datos directamente en el form, no? al cargar el formulario que es el primero.

    te paso los formularios:

    Primero --> primer form

    Segundo

    Lo que hago es, meter datos en el primer formulario, o sea, dar de alta a un trabajador por ej y en el segundo quiero hacer doble click y que cargue en el primer form y que se imprima solo lo del segundo form.

    Te paso los form que tengo:

    Form2

    Form3

    Gracias y perdona mi ignorancia!

    Mil gracias a tod@s por vuestra ayuda


    • Editado Andoniar1978 jueves, 27 de diciembre de 2018 12:49
    jueves, 27 de diciembre de 2018 12:42
  • Hola:
    ¿Has probado el ejemplo que te puse?
    Cuando lo hayas probado, lo adaptas a tus necesidades.

    Te comento que tu pregunta inicial, es como al hacer click sobre una linea de datagridview, pase esos datos a otro form.
    En las siguientes respuestas vas preguntando cada vez por una cosa diferente con lo que el hilo se esta haciendo casi incomprensible.

    Un saludo desde Bilbo
    Carlos

    jueves, 27 de diciembre de 2018 20:25
  • Sorry!! pero es que no me aclaro con esto jejeje. No obstante GRACIAS por tu ayuda eh.

    Tienes razón. El primer problema era que me daba error al cargar los datos pero luego me di cuenta cuál era el error y lo solucioné (lo indico en un mensaje); El problema era que no tenía todos los datos del formulario en el datagridview y por eso daba error a la hora de imprimir pero al poner todos los datos ya no da error cuando imprimo pero me salen los datos que están ocultos en el datagridview y ya enfoco el problema ahí. No sé si ahora me he explicado mejor...

    Resumiendo, el error del doble click ya lo tengo resuelto pero sólo quiero que me imprima lo que está visible en el datagridview.

    MIL GRACIAS CARLOS Y SIENTO POR TODO

    Gracias tod@s los demás también.

    FELIZ AÑO!!

    viernes, 28 de diciembre de 2018 9:10
  • Hola:
    Te expongo un ejemplo de imprimir un DataGridview con PrintDocument.
    Lo adaptas a tus necesidades

    El Form es como el de la imagen

    La imagen de proyecto es la siguiente

    Copia y pega el siguiente codigo

    Option Explicit On
    Option Strict On
    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"
                    Dim loDataAdapter As New SqlDataAdapter(lsQuery, loConexion)
                    Dim loDataTable As New DataTable
                    loDataAdapter.Fill(loDataTable)
                    MyDataGridView.DataSource = loDataTable
                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
            '
            '
            '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
    Se 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

    P.D.
    Espero que te sea de utilidad

    En la imagen del Form, NO aparece 1 control PrintDocument llamado MyPrintDocument

    Un saludo desde Bilbo
    Carlos



    viernes, 28 de diciembre de 2018 21:31
  • Perdón por el retraso y gracias por la colaboración, pero he estado fuera. Voy a replantear la pregunta en el foro siendo más explícito.

    Gracias carlos por tu ayuda pero no me ha valido. :(

    MIL GRACIAS

    viernes, 25 de enero de 2019 8:40
  • Hola:
    >Gracias carlos por tu ayuda pero no me ha valido<

    ¿Has probado el ejemplo?
    ¿Puedes explicar porque NO te ha valido?

    Un saludo desde Bilbo
    Carlos

    viernes, 25 de enero de 2019 8:45