Представление сетки данных печати пропускает первую строку
Я создал предварительный просмотр для представления сетки данных, которое я хочу напечатать. Код работает нормально, но есть небольшая проблема
В строке представления сетки данных отсутствует идентификатор 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