Debsbond008 Ответов: 1

Я работаю в приложении 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

1 Ответов

Рейтинг:
0

Gerry Schmitz

Вы не "сгибаете" существующий взгляд, который соответствует его цели, чтобы соответствовать чему-то другому.

Создайте новое представление (производное от представления "онлайн"), которое будет "соответствовать" странице. Запустите его с тем же источником данных, что и "онлайн-версия".

Обычно это просто вопрос "растяжения" размеров и / или контроля разрывов страниц.


Debsbond008

в чем ошибка в этом коде? быть конкретными