Member 11691579 Ответов: 1

Как добавить верхний и Нижний колонтитулы, а также время печати и дату с помощью printdocument1 из datagridview в VB.NET


Привет
У меня есть приложение созданное с помощью Visual Studio 2015 оно работает нормально но при необходимости когда я хочу распечатать данные из datgridview с датой печати и верхним и нижним колонтитулами
я использую этот код
Private mRow As Integer = 0
    Private newpage As Boolean = True

'''''''
И в событии Printdocument
Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage


        ' sets it to show '...' for long text
        Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
        fmt.LineAlignment = StringAlignment.Center
        fmt.Trimming = StringTrimming.EllipsisCharacter
        Dim y As Int32 = e.MarginBounds.Top
        Dim rc As Rectangle
        Dim x As Int32
        Dim h As Int32 = 0
        Dim row As DataGridViewRow

        ' print the header text for a new page
        '   use a grey bg just like the control
        If newpage Then
            row = DataGridView1.Rows(mRow)
            x = e.MarginBounds.Left
            For Each cell As DataGridViewCell In row.Cells
                ' since we are printing the control's view,
                ' skip invidible columns
                If cell.Visible Then
                    rc = New Rectangle(x, y, cell.Size.Width, cell.Size.Height)

                    e.Graphics.FillRectangle(Brushes.LightGray, rc)
                    e.Graphics.DrawRectangle(Pens.Black, rc)

                    ' reused in the data pront - should be a function
                    Select Case DataGridView1.Columns(cell.ColumnIndex).DefaultCellStyle.Alignment
                        Case DataGridViewContentAlignment.BottomRight,
                         DataGridViewContentAlignment.MiddleRight
                            fmt.Alignment = StringAlignment.Far
                            rc.Offset(-1, 0)
                        Case DataGridViewContentAlignment.BottomCenter,
                        DataGridViewContentAlignment.MiddleCenter
                            fmt.Alignment = StringAlignment.Center
                        Case Else
                            fmt.Alignment = StringAlignment.Near
                            rc.Offset(2, 0)
                    End Select

                    e.Graphics.DrawString(DataGridView1.Columns(cell.ColumnIndex).HeaderText,
                                            DataGridView1.Font, Brushes.Black, rc, fmt)
                    x += rc.Width
                    h = Math.Max(h, rc.Height)
                End If
            Next
            y += h

        End If
        newpage = False

        ' now print the data for each row
        Dim thisNDX As Int32
        For thisNDX = mRow To DataGridView1.RowCount - 1
            ' no need to try to print the new row
            If DataGridView1.Rows(thisNDX).IsNewRow Then Exit For

            row = DataGridView1.Rows(thisNDX)
            x = e.MarginBounds.Left
            h = 0

            ' reset X for data
            x = e.MarginBounds.Left

            ' print the data
            For Each cell As DataGridViewCell In row.Cells
                If cell.Visible Then
                    rc = New Rectangle(x, y, cell.Size.Width, cell.Size.Height)

                    ' SAMPLE CODE: How To 
                    ' up a RowPrePaint rule
                    'If Convert.ToDecimal(row.Cells(5).Value) < 9.99 Then
                    '    Using br As New SolidBrush(Color.MistyRose)
                    '        e.Graphics.FillRectangle(br, rc)
                    '    End Using
                    'End If

                    e.Graphics.DrawRectangle(Pens.Black, rc)

                    Select Case DataGridView1.Columns(cell.ColumnIndex).DefaultCellStyle.Alignment
                        Case DataGridViewContentAlignment.BottomRight,
                         DataGridViewContentAlignment.MiddleRight
                            fmt.Alignment = StringAlignment.Far
                            rc.Offset(-1, 0)
                        Case DataGridViewContentAlignment.BottomCenter,
                        DataGridViewContentAlignment.MiddleCenter
                            fmt.Alignment = StringAlignment.Center
                        Case Else
                            fmt.Alignment = StringAlignment.Near
                            rc.Offset(2, 0)
                    End Select

                    e.Graphics.DrawString(cell.FormattedValue.ToString(),
                                      DataGridView1.Font, Brushes.Black, rc, fmt)

                    x += rc.Width
                    h = Math.Max(h, rc.Height)
                End If

            Next
            y += h
            ' next row to print
            mRow = thisNDX + 1

            If y + h > e.MarginBounds.Bottom Then
                e.HasMorePages = True
                ' mRow -= 1   causes last row to rePrint on next page
                newpage = True
                Return
            End If
        Next

а событие здесь
Private Sub PrintDocument1_BeginPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.BeginPrint
       mRow = 0
       newpage = True
       PrintPreviewDialog1.PrintPreviewControl.StartPage = 0
       PrintPreviewDialog1.PrintPreviewControl.Zoom = 1.0
   End Sub

и кнопка для печати
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      PrintPreviewDialog1.Document = PrintDocument1
      PrintPreviewDialog1.ShowDialog()
  End Sub


Что я уже пробовал:

Код уже прилагается к примеру

1 Ответов

Рейтинг:
0

Maciej Los

Если вы хотите добавить верхний и Нижний колонтитулы, вы должны помнить об этом:
1. рассчитайте расстояние, которое вам нужно зарезервировать для верхнего и нижнего колонтитулов
2. печатать заголовок
3. распечатайте данные из datagridview (не забудьте измерить текстовое пространство, необходимое для нижнего колонтитула)
4. печать нижнего колонтитула
5. перейдите на следующую страницу, если еще есть что распечатать

Dim linesPerPage As Single = 0
Dim line As String = Nothing
Dim count As Long = 0

' Calculate the number of lines per page.
linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics)
linesPerPage -= 4 '1 for header and footer and 1 for space between text and header/footer

'print header
ev.Graphics.DrawString("Header's text goes here", printFont, Brushes.Black, leftMargin, yPos, New StringFormat())
ev.Graphics.DrawString("---", printFont, Brushes.Black, leftMargin, yPos, New StringFormat())

'print data
While count < linesPerPage
    'your logic to print datagridview data goes here
    line = DataGridView.Rows(count).Cell(0).Value 'gets first column data only
    ev.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos, New StringFormat())
    count += 1
End While

'print footer
ev.Graphics.DrawString("---", printFont, Brushes.Black, leftMargin, yPos, New StringFormat())
ev.Graphics.DrawString("Footer's text goes here", printFont, Brushes.Black, leftMargin, yPos, New StringFormat())

' If more lines exist, print another page.
If (line IsNot Nothing) Then
    ev.HasMorePages = True
Else
    ev.HasMorePages = False
End If


Для получения более подробной информации, пожалуйста, смотрите: Объект printdocument.Событие PrintPage (System.Рисование.Печатание)[^]
Печать DataGridView[^]


Member 11691579

Спасибо за Вашу помощь но у меня есть ошибка с вашим кодом
ev и printFont и leftMargin и yPos не объявлены

Maciej Los

Перейдите по первой ссылке, которая предоставляет документацию MSDN.

Member 11691579

Хорошо я буду Вам благодарен

simonlumga

можете ли вы предоставить полный код

Maciej Los

Там почти полный код. Пожалуйста, смотрите статьи по ссылкам