Я работаю в приложении windows forms(VS2017), и у меня есть datagridview, который содержит данные и изображения. Я должен распечатать этот datagridview на нескольких страницах с изображениями.
У меня есть DataGridView, который содержит данные и изображения, извлеченные из базы данных. Я должен распечатать это представление таблицы данных.
Проблема:
1. DataGridView содержит данные, которые не поместятся на одной странице, поэтому придется печатать на нескольких страницах.
2. изображения не отображаются в режиме предварительного просмотра.
3. Данные, превышающие первую страницу, не отображаются на следующей странице и не перезаписываются на первой странице(предварительный просмотр).
Код, который я пробовал, печатает данные на первой странице, а на следующей странице есть только заголовки столбцов(без строк).
*Мой код сначала открывает диалоговое окно предварительного просмотра печати, а затем я должен его распечатать.
** Я также изменил параметр печати(элементов) из диалогового окна printpreviewdialog..
Что я уже пробовал:
Private Sub Print_lst_Click(sender As Object, e As EventArgs) Handles Print_lst.Click Dim b As New ToolStripButton b.Image = CType(PrintPreviewDialog1.Controls(1), ToolStrip).ImageList.Images(0) b.ToolTipText = "Print" b.DisplayStyle = ToolStripItemDisplayStyle.Image AddHandler b.Click, AddressOf PrintPreview_PrintClick CType(PrintPreviewDialog1.Controls(1), ToolStrip).Items.RemoveAt(0) CType(PrintPreviewDialog1.Controls(1), ToolStrip).Items.Insert(0, b) AddHandler PrintDocument1.PrintPage, AddressOf PrintDocument1_PrintPage ' PrintPreviewDialog1.StartPosition = FormStartPosition.CenterParent ' PrintPreviewDialog1.WindowState = FormWindowState.Maximized PrintPreviewDialog1.Document = PrintDocument1 PrintDocument1.OriginAtMargins = True PrintDocument1.DefaultPageSettings.Margins = New Drawing.Printing.Margins(0, 0, 0, 0) 'PrintPreviewDialog1.Icon = Icon PrintPreviewDialog1.WindowState = FormWindowState.Maximized PrintPreviewDialog1.ShowDialog() End Sub Private Sub PrintPreview_PrintClick(sender As Object, e As EventArgs) Try PrintDialog1.Document = PrintDocument1 If PrintDialog1.ShowDialog() = DialogResult.OK Then PrintDocument1.Print() End If Catch ex As Exception End Try clean() End Sub Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim x As Integer = 50 Dim y As Integer = 50 Dim header As Boolean = True 'draw headers Dim j As Integer = 0 Do While (j < Me.DataGridView1.Columns.Count) Dim rect As Rectangle = New Rectangle(x, y, Me.DataGridView1.Columns(j).Width, Me.DataGridView1.ColumnHeadersHeight) e.Graphics.FillRectangle(Brushes.LightGray, rect) e.Graphics.DrawRectangle(Pens.Black, rect) If (Not (Me.DataGridView1.Columns(j).HeaderText) Is Nothing) Then e.Graphics.DrawString(Me.DataGridView1.Columns(j).HeaderText, SystemFonts.DefaultFont, Brushes.Black, rect) End If x = (x + rect.Width) j = (j + 1) Loop x = 50 y = (y + Me.DataGridView1.ColumnHeadersHeight) 'draw rows For whRow = whRow To Me.DataGridView1.RowCount - 1 Dim drow As DataGridViewRow = Me.DataGridView1.Rows(whRow) j = 0 Do While (j < Me.DataGridView1.Columns.Count) Dim cell As DataGridViewCell cell = drow.Cells(j) Dim rect As Rectangle = New Rectangle(x, y, cell.Size.Width, cell.Size.Height) e.Graphics.DrawRectangle(Pens.Black, rect) If (Not (cell.Value) Is Nothing) Then e.Graphics.DrawString(cell.Value.ToString, SystemFonts.DefaultFont, Brushes.Black, rect) End If x = (x + rect.Width) j = (j + 1) Loop x = 50 y = (y + drow.Height) '----------------------New page---------------------------- If (y > e.MarginBounds.Bottom) Then 'Print new page e.HasMorePages = True 'if I add y=50 or Exit Sub here then the remaining data(that doesn't fit in the firstPage is overwritten in the firstpage (2nd page contains the header only) End If '----------------------------------------------------------------- Next End Sub