Tengo un Datagrid con la información recuperada de una base de datos y me gustaría que la salida de impresión de estar en formato de tabla con filas y columnas. Mi método es simple pero el resultado es muy confuso. Los pensamientos?

  Private Sub Imprimir_Click(sender As Object, e As EventArgs) Handles Imprimir.Click
PrintPreviewDialog1.PrintPreviewControl.Zoom = 1.0
PrintPreviewDialog1.FindForm.WindowState = FormWindowState.Maximized
PrintPreviewDialog1.ShowDialog()
End Sub
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As 
System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim y As Integer = 70
PrintDocument1.DefaultPageSettings.Landscape = True
e.Graphics.DrawString("TransporGest - Registo de Operações", 
New Font("Verdana", 10, FontStyle.Bold), Brushes.Black, 30, 30)
For Each dr As DataGridViewRow In dg.Rows
e.Graphics.DrawString(dr.Cells(0).Value & " | " & dr.Cells(2).Value & 
" | " & dr.Cells(3).Value & " | " & dr.Cells(4).Value & " | " &
dr.Cells(6).Value & " | " & dr.Cells(7).Value & " | " & 
dr.Cells(9).Value & " | " & dr.Cells(11).Value & " | " & 
dr.Cells(12).Value, New Font("Verdana", 10), Brushes.Black, 30, y)
y += 20
Next
End Sub
End Class
  • Usted puede imprimir como ooopsoft hizo, pero en mi opinión reportviewer es mucho más fácil cuando se trata de datagridview de impresión, pero de nuevo, es sólo mi opinión.
  • Gracias, estoy mirando en esa opción y se ve mucho más fácil!
  • Recientemente he trabajado con reportviewer un montón, así, hágamelo saber si usted tiene cualquier preguntas más 🙂
  • He donne mi informe con crystal! Fue super fácil! Sin embargo, tengo algunas formas para utilizar mi consulta sql. Hay alguna forma de que puede cambiar el cristal de informe de la consulta sobre la VB?
InformationsquelleAutor A.Barbosa | 2014-07-09

3 Comentarios

  1. 7

    Añadir a la Forma(Diseño) Button1, PrintDocument1 ,PrintPreviewDialog1 , su -> DataGridView1

    y pegar el código:

    Dim mRow As Integer = 0
    Dim newpage As Boolean = True
    Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    With DataGridView1
    Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
    fmt.LineAlignment = StringAlignment.Center
    fmt.Trimming = StringTrimming.EllipsisCharacter
    Dim y As Single = e.MarginBounds.Top
    Do While mRow < .RowCount
    Dim row As DataGridViewRow = .Rows(mRow)
    Dim x As Single = e.MarginBounds.Left
    Dim h As Single = 0
    For Each cell As DataGridViewCell In row.Cells
    Dim rc As RectangleF = New RectangleF(x, y, cell.Size.Width, cell.Size.Height)
    e.Graphics.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
    If (newpage) Then
    e.Graphics.DrawString(DataGridView1.Columns(cell.ColumnIndex).HeaderText, .Font, Brushes.Black, rc, fmt)
    Else
    e.Graphics.DrawString(DataGridView1.Rows(cell.RowIndex).Cells(cell.ColumnIndex).FormattedValue.ToString(), .Font, Brushes.Black, rc, fmt)
    End If
    x += rc.Width
    h = Math.Max(h, rc.Height)
    Next
    newpage = False
    y += h
    mRow += 1
    If y + h > e.MarginBounds.Bottom Then
    e.HasMorePages = True
    mRow -= 1
    newpage = True
    Exit Sub
    End If
    Loop
    mRow = 0
    End With
    End Sub
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    PrintPreviewDialog1.Document = PrintDocument1
    PrintPreviewDialog1.ShowDialog()
    End Sub
    • MUCHAS GRACIAS! NO TIENES IDEA DE LO MUCHO QUE ME HAS AYUDADO!
    • sin embargo, todavía me queda una duda, ¿cómo puedo seleccionar filas específicas para imprimir en lugar de la impresión de todos ellos?
    • El código anterior imprimir correctamente todo un datagridview, una fila rápidamente, pero no tan elegante, usted puede: a) comentario de la línea Do While mRow < .RowCount b) comentario de la línea loop c) establecer para la fila (4) por ejemplo: Dim mRow As Integer = 4 d) establecer Dim newpage As Boolean = False
    • Lo siento, he cometido un error. Me refería a las Columnas, no filas. Todas las Columnas que no se ajuste a la página, incluso si es en el paisaje.
    • Tenga en cuenta que este tiene varios problemas, principalmente) en cada nueva página se salta la primera fila b) si cierra el cuadro de diálogo y volver, no va a tratar de la primera página correctamente c) se imprimirá invisible columnas. Ha habido varios puestos de cómo solucionar estos problemas; estas y otras cuestiones se resuelven en Cómo imprimir datagridview mesa con su encabezado
  2. 2

    Para o Columnas (columna de ejemplo 1,3,4)

    Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim custCells As Integer() = {1, 3, 4}
    With DataGridView1
    Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
    fmt.LineAlignment = StringAlignment.Center
    fmt.Trimming = StringTrimming.EllipsisCharacter
    Dim y As Single = e.MarginBounds.Top
    Do While mRow < .RowCount
    Dim row As DataGridViewRow = .Rows(mRow)
    Dim x As Single = e.MarginBounds.Left
    Dim h As Single = 0
    For Each cell As Integer In custCells
    Dim rc As RectangleF = New RectangleF(x, y, row.Cells(cell).Size.Width, row.Cells(cell).Size.Height)
    e.Graphics.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
    If (newpage) Then
    e.Graphics.DrawString(DataGridView1.Columns(cell).HeaderText, .Font, Brushes.Black, rc, fmt)
    Else
    e.Graphics.DrawString(DataGridView1.Rows(row.Cells(cell).RowIndex).Cells(cell).FormattedValue.ToString(), .Font, Brushes.Black, rc, fmt)
    End If
    x += rc.Width
    h = Math.Max(h, rc.Height)
    Next
    newpage = False
    y += h
    mRow += 1
    If y + h > e.MarginBounds.Bottom Then
    e.HasMorePages = True
    mRow -= 1
    newpage = True
    Exit Sub
    End If
    Loop
    mRow = 0
    End With
    End Sub
  3. 1

    Usted puede encontrar que el movimiento de los datos a Excel/Word sería tan útil:

        Private Sub tsbtnCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbtnCopy.Click
    dgv01.SuspendLayout()
    dgv01.RowHeadersVisible = False
    If dgv01.SelectedRows.Count = 0 Then dgv01.SelectAll()
    Clipboard.SetDataObject(dgv01.GetClipboardContent())
    dgv01.ClearSelection()
    dgv01.RowHeadersVisible = True
    dgv01.ResumeLayout()
    End Sub

    O que el usuario seleccione todos (haga clic en la celda superior izquierda) para copiar/Pegar.

Dejar respuesta

Please enter your comment!
Please enter your name here