Представление сетки данных печати пропускает первую строку

Я создал предварительный просмотр для представления сетки данных, которое я хочу напечатать. Код работает нормально, но есть небольшая проблема

Скриншот проблемы:

В строке представления сетки данных отсутствует идентификатор 1, он всегда начинается с 2. Как решить эту проблему? Пожалуйста помоги.

Мой код:

       Private Sub PrintDocument1_PrintPage(sender As System.Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

    Dim mRow As Integer = 0
    Dim newpage As Boolean = True
    PrintDocument1.DefaultPageSettings.Landscape = True

    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

2 ответа

The If (newpage)заставляет его рисовать заголовки вместо первой строки.

Вы можете изменить раздел

      newpage = False
y += h
mRow += 1

к

      If not newpage Then
    mRow += 1
End If
newpage = False
y += h

Распечатывайте каждую часть отдельно, чтобы избежать подобных проблем. Часть заголовков принадлежитColumnsколлекцию, затем сначала распечатайте ее, прежде чем обрабатыватьRowsиCellsчасти.

У вас есть еще одна проблема в вашем коде, которую нужно исправить. mRow— это локальная переменная, которая не сохраняет последнюю напечатанную строку для пропуска или новую строку для продолжения при запросе новой страницы. Это должно быть поле класса.

      Private mRow As Integer

Private Sub PrintPreviewButton(sender As Object, e As EventArgs) _
    Handles Button1.Click
    PrintDocument1.DefaultPageSettings.Landscape = True
    mRow = 0

    Using d = New PrintPreviewDialog With {
        .Document = PrintDocument1
    }
        d.ShowDialog(Me)
    End Using
End Sub

Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) _
    Handles PrintDocument1.PrintPage
    Dim g = e.Graphics
    Dim x As Integer = e.MarginBounds.X
    Dim y As Integer = e.MarginBounds.Y

    With DataGridView1
        Using sf = New StringFormat(StringFormat.GenericTypographic) With {
        .LineAlignment = StringAlignment.Center,
        .Trimming = StringTrimming.EllipsisCharacter
        }
            For Each col As DataGridViewColumn In .Columns
                Dim rect = New Rectangle(
                    x, y,
                    col.Width, col.DataGridView.ColumnHeadersHeight)

                g.DrawRectangle(Pens.Black, rect)
                rect.Inflate(-3, 0)
                g.DrawString(col.HeaderText, .Font, Brushes.Black, rect, sf)

                x += col.Width
            Next

            y += .ColumnHeadersHeight

            For i = mRow To .RowCount - 1
                Dim row = .Rows(i)

                If row.IsNewRow Then Exit Sub

                x = e.MarginBounds.X

                For Each cell As DataGridViewCell In row.Cells
                    Dim rect = New Rectangle(New Point(x, y), cell.Size)

                    g.DrawRectangle(Pens.Black, rect)
                    rect.Inflate(-3, 0)
                    g.DrawString(cell.FormattedValue?.ToString(),
                                    .Font, Brushes.Black, rect, sf)

                    x += cell.Size.Width
                Next cell

                y += row.Height

                If y + row.Height > e.MarginBounds.Bottom Then
                    mRow = i + 1
                    e.HasMorePages = True
                    Exit For
                End If
            Next i
        End Using
    End With
End Sub
Другие вопросы по тегам