Как разработать подпрограмму, которая записывает данные в форму и может быть использована с помощью файла .printdocument
I'm hoping here is a simple answer that my lack of programming skills are hiding from me... I generate reports that I'd like to immediately display on a FORM for the Users review and acceptance. Once accepted this can be PRINTED. The "on-form" report is a subset of the full report that is included in the printed document (includes logo's, border graphics and more detail text, etc), so most of the generation of the document is the same, but not all. Rather than duplicate all the report code twice, once for the form and again for printing I hope there is a way to generate a common subroutine that both the form report and printing routines can call and that contains the conditional formatting lines.
Для записи в форму:
Module DisplayCode Sub WriteOnFrom() ' writes to form With frmOutput .Visible = True .WindowState = FormWindowState.Normal .PrintPreviewControl.Visible = False Dim drawPen As Pen Dim drawBrush As SolidBrush Dim drawFont As Font Dim drawObject As Graphics = .CreateGraphics() 'Create object for the page Dim drawString As String = "Sample Text" drawObject.Clear(Color.White) 'clears the current screen drawFont = New Font("Arial", 16, FontStyle.Bold) drawBrush = New SolidBrush(Color.BlueViolet) drawObject.DrawString("text in a box", drawFont, drawBrush, 150, 50) drawFont = New Font("Calibri", 20, FontStyle.Italic) drawBrush = New SolidBrush(Color.Red) drawObject.DrawString("text above a line", drawFont, drawBrush, 150, 290) drawPen = New Pen(Color.Black, 3) drawObject.DrawRectangle(drawPen, 120, 50, 200, 25) drawPen = New Pen(Color.Purple, 5) drawObject.DrawLine(drawPen, 150, 320, 350, 320) drawFont.Dispose() drawBrush.Dispose() drawObject.Dispose() End With End Sub End Module
На объект printdocument:
Public Class PrintOutput Inherits System.Drawing.Printing.PrintDocument Private Sub PrintOutput_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles Me.PrintPage 'Prepares printed document Dim drawPen As Pen Dim drawBrush As SolidBrush Dim drawFont As Font Dim drawString As String = "Sample Text" 'Can I move this to a subroutine outside the Class? drawFont = New Font("Arial", 16, FontStyle.Bold) drawBrush = New SolidBrush(Color.BlueViolet) e.Graphics.DrawString("text in a box", drawFont, drawBrush, 150, 50) drawFont = New Font("Calibri", 20, FontStyle.Italic) drawBrush = New SolidBrush(Color.Red) e.Graphics.DrawString("text above a line", drawFont, drawBrush, 150, 290) drawPen = New Pen(Color.Black, 3) e.Graphics.DrawRectangle(drawPen, 120, 50, 200, 25) drawPen = New Pen(Color.Purple, 5) e.Graphics.DrawLine(drawPen, 150, 320, 350, 320) e.HasMorePages = False drawFont.Dispose() drawBrush.Dispose() drawPen.Dispose() End Sub End Class
Конечно, это один и тот же отчет для обоих на данный момент, так что просто пример для демонстрации принципов.
Что я уже пробовал:
Конечно, можно использовать элемент управления PrintPreview на моем frmOutput и разработать все это как объект PrintDocument, но я бы предпочел этого не делать. Во-первых, это занимает некоторое время, чтобы сгенерировать это (on-form мгновенно), во-вторых, я не заинтересован в формате формата бумаги и т. д. и просто помещаю его на frmOutput фиксированного размера и, наконец, я все еще не знаю, как сгенерировать подмножество этого отчета для элемента управления PrintPreview относительно полного отчета для печати.
Кстати, для отчета о форме, похоже, мне все еще нужно использовать .CreateGraphics() писать самой формы, что представляет собой конфликт, чтобы просто с помощью электронной.Графика. для PrintDocument. Я не особенно стремлюсь писать непосредственно в форму, поэтому подойдет любой элемент управления, помещенный в форму, которая принимает текст и графику.
Есть какие-нибудь замечательные предложения?
Richard MacCutchan
Мое единственное предложение состояло бы в том, чтобы перестать делать вещи настолько трудными для себя и использовать встроенные функции Print и PrinPreview .Сеть, с конкретной целью сделать жизнь проще.
IanSp
Спасибо за ваш ответ. В интересах простоты этого вопроса я не перечислил все причины, по которым я предпочел бы не использовать элемент управления PrintPreview в своей форме, но пока я его не исключаю. Однако, если бы я должен был использовать его, как передать условное условие процедуре PrintPage, чтобы я мог распечатать полный вывод на принтер и только его части (подмножество) в элемент управления PrintPreview на форме, я, кажется, не могу найти способ передать флаг подпрограмме PrintPage. Ваша проницательность была бы очень полезна.