DataGridPrinter - A class to print data grid in a nicely formatted way
The DataGridPrinter is a class that you can add to your applications to print (or preview) a data grid (or DataGridView) in a nciely formatted way.
The class allows you to control settings such as the header height, footer height, header font, grid font, footer font, grid line colour, header border colour, inter section spacing and so on.
The class takes care of putting the grid headings at the top of each page and generating a new page if the grid rows exceed one page etc.
Any comments or suggestions?
Last edited by Merrion; Jan 24th, 2016 at 03:21 PM.
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
New version - now has a property "PagesAcross" which allows you to overflow the grid across more than one page across...(users of excel know all about this functionality)
Last edited by Merrion; Nov 2nd, 2009 at 03:04 AM.
Reason: removed old code
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
Nice Sample Merrion.
How could this work under Datagridview. I have tried to convert everything named datagrid to datagridview.The page setup works fine, but the print gives me errors in the functions
getColumnHeadingText(),MappedColumnToBaseColumn
Over datagrid's tablestyles and gridcolumnstyles
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
Column width is in the same proportions as the source data grid - if you make the column wider on the source grid it becomes wider on the print/preview grid.
Column width is proportional to the .pagesAcross number - the more pages across your grid is set to, the wider each column can be made.
So - increase your pages across setting and/or alter the column widths in the source data grid.
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
I downloaded the file from the post with:
Thanks to Berthold Simon, who converted the C# code.
.
how do i use this in my project? i have a datagridview and a button. What do i need to do so that when the button is pressed the datagridview is printed? i.e how do i use what i just downloaded?
MyPrintDocument.DefaultPageSettings.Margins = New Margins(40, 40, 40, 40)
if MessageBox.Show("Do you want the report to be centered on the page", "InvoiceManager - Center on Page", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes then
MyDataGridViewPrinter = new DataGridViewPrinter(MyDataGridView, MyPrintDocument, true, true, "Customers", new Font("Tahoma", 18, FontStyle.Bold, GraphicsUnit.Point), Color.Black, true)
else
MyDataGridViewPrinter = new DataGridViewPrinter(MyDataGridView, MyPrintDocument, false, true, "Customers", new Font("Tahoma", 18, FontStyle.Bold, GraphicsUnit.Point), Color.Black, true)
end if
Return True
End Function
Private Sub MyPrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles MyPrintDocument.PrintPage
Dim more As Boolean
Try
more = MyDataGridViewPrinter.DrawDataGridView(e.Graphics)
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
If GridPrinter Is Nothing Then
GridPrinter = New DataGridPrinter(Me.dgReport)
End If
With (GridPrinter)
.HeaderText = "Stock Report"
.HeaderHeightPercent = 5
.FooterHeightPercent = 0
.HeaderPen = New Pen(Color.Transparent)
.GridPen = New Pen(Color.Black)
End With
With Me.PrintPreviewDialog1
.Document = GridPrinter.PrintDocument
If .ShowDialog = DialogResult.OK Then
GridPrinter.Print()
End If
End With
It Shows Following Exception in the Line "If .ShowDialog = DialogResult.OK Then"
************** Exception Text **************
System.InvalidCastException: Specified cast is not valid.
at System.Windows.Forms.PrintPreviewControl.CalculatePageInfo()
at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
You need to put a breakpoint in the control's PrintPage event and step through what it is doing as the error is occuring there somewhere....let me know when you find the line that is the underlying cause of the error.
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
is the datagridprinter compatable with VS 2005 Express edition?
its just i am tryin to use it in my project adn i have having difficulty as it is saying that datagrid isnt defined and so when i look at the code provided it isnt but if you hover over the text it says it is defined as 'DataGridPrinter.DataGridPrinter' so if i declare this manually it says in the decleratioin that 'DataGridPrinter.DataGridPrinter' isnt defined.
Can someone tell me where i am going wrong
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
It was written using VB2005 and it does not use anything that is not present in the express edition. Make sure you are opening the solution file (*.sln) not one of the projects (*.vbp) as in the latter case the references might not be loaded...
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
Hi,
Thank you for the DataGridView Printer, awesome work!!!
I too had some problems getting it to work, but it was minor stuff so I posted the code below (You still need to add the Class to your project):
Thank you!
Funch
Public Class Form1
Dim cnStr As String = "Provider=SQLOLEDB;Initial Catalog=Reporting;Data Source=ncso-exch;"
Dim myDataGridViewPrinter
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'DG.Rows.Clear()
Dim rs As New ADODB.Recordset
Dim strSQL As String = "select * from Userdata order by username"
rs.Open(strSQL, cnStr)
While Not rs.EOF
DG.Rows.Add()
DG.Rows(DG.Rows.Count - 1).Cells(0).Value = rs.Fields.Item("Username").Value.ToString.Replace("NCSO\", "")
DG.Rows(DG.Rows.Count - 1).Cells(1).Value = rs.Fields.Item("MachineName").Value.ToString
DG.Rows(DG.Rows.Count - 1).Cells(2).Value = rs.Fields.Item("IPAddress").Value.ToString
DG.Rows(DG.Rows.Count - 1).Cells(3).Value = rs.Fields.Item("LastRun").Value.ToString
DG.Rows(DG.Rows.Count - 1).Cells(4).Value = rs.Fields.Item("Version").Value.ToString
DG.Rows(DG.Rows.Count - 1).Cells(5).Value = rs.Fields.Item("CMVersion").Value.ToString
DG.Rows(DG.Rows.Count - 1).Cells(6).Value = rs.Fields.Item("DBServer").Value.ToString
rs.MoveNext()
End While
rs.Close()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
End
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If SetupThePrinting() Then MyPrintDocument.Print()
End Sub
Private Function SetupThePrinting() As Boolean
Dim MyPrintDialog As PrintDialog = New PrintDialog()
If MessageBox.Show("Do you want the report to be centered on the page", "InvoiceManager - Center on Page", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
MyDataGridViewPrinter = New DataGridViewPrinter(DG, MyPrintDocument, True, True, "Customers", New Font("Tahoma", 18, FontStyle.Bold, GraphicsUnit.Point), Color.Black, True)
Else
myDataGridViewPrinter = New DataGridViewPrinter(DG, MyPrintDocument, False, True, "Customers", New Font("Tahoma", 18, FontStyle.Bold, GraphicsUnit.Point), Color.Black, True)
End If
Return True
End Function
Private Sub MyPrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles MyPrintDocument.PrintPage
Dim more As Boolean
Try
more = MyDataGridViewPrinter.DrawDataGridView(e.Graphics)
If more Then e.HasMorePages = True
Catch Ex As Exception
MessageBox.Show(Ex.Message & vbCrLf & Ex.StackTrace, "caption", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Sub btnPrintPreview_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrintPreview.Click
If SetupThePrinting() Then
Dim MyPrintPreviewDialog As PrintPreviewDialog = New PrintPreviewDialog()
MyPrintPreviewDialog.Document = MyPrintDocument
MyPrintPreviewDialog.ShowDialog()
End If
End Sub
End Class
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
I tried using the files from the original post in order to print the output of my datagrid, but I get:
System.InvalidCastException: Specified cast is not valid
This is the line specified in the DataGrid class
For nextLine = _CurrentPrintGridLine To Min((_CurrentPrintGridLine + RowsPerPage(_PrintFont, e.Graphics)), CType(_DataGrid.DataSource, System.Data.DataTable).DefaultView.Count)
This is the code I am using:
Code:
Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
'Button that prints the datagrid
If GridPrinter Is Nothing Then
GridPrinter = New DataGridPrinter(Me.dgInventory)
End If
Try
With Me.printDia 'printDia is PrintPreviewDialogue added manually
.Document = GridPrinter.PrintDocument
If .ShowDialog = DialogResult.OK Then
GridPrinter.Print()
End If
End With
Catch ex As System.InvalidCastException
MsgBox(Convert.ToString(ex))
End Try
End Sub
Code:
Private Sub frmInvReport_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Create connection to Database
Dim connStr As String
Dim dbObjConn As New OleDb.OleDbConnection
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=InventoryManagement.mdb;"
dbObjConn.ConnectionString = connStr
'create SQL statement
Dim selectString As String = "Select * from Products"
'create DataAdapter
Dim sqlDA As New OleDb.OleDbDataAdapter(selectString, connStr)
'Fill dataset
Try
dbObjConn.Open()
Dim ds As New Data.DataSet
sqlDA.Fill(ds, "Products")
dgInventory.CaptionText = "Inventory Report"
dgInventory.DataSource = ds.DefaultViewManager
Catch ex As OleDb.OleDbException
MsgBox(Convert.ToString(ex))
Finally
dbObjConn.Close()
End Try
End Sub
So the datagrid is filled in properly, but when I try printing I get the cast error. If you need the whole project or more information please let me know.
Thanks
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
Yup - it is because the data source of your grid is a DataSet rather than a DataTable --- the code needs to be altered to cater for this possibility...
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
Well, I started using a dataTable but the examples I was lookign at all end up binding using a dataSet in the end. I'll show you the example I was following to do a dataTable instead.
Code:
Dim Table1 As DataTable
Table1 = New DataTable("Products")
Dim Row1 As DataRow
Dim description As DataColumn = New DataColumn("description")
description.DataType = System.Type.GetType("System.String")
Table1.Columns.Add("description")
Row1 = Table1.NewRow()
'declaring a new row
Row1.Item("description") = "blah blah blah"
Table1.Rows.Add(Row1)
so far so good it seems. Then the example finishes off by doing this
Code:
Dim ds As New Data.DataSet
ds.Tables.Add(Table1)
dgInventory.SetDataBinding(ds, "Products")
which basically brings me to the exact same problem lol. Can someone kinda guide me in the right direction? *blushes*
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
Yet another version.
New in this release:
(1) Can work with the DataGrid or DataGridView control
(2) Raises an event to allow custom colouring of a data grid cell e.g.:-
Code:
Private Sub GridPrinter_QueryCellFormat(ByVal sender As Object, ByVal e As QueryCellFormatEventArgs) Handles GridPrinter.QueryCellFormat
'\\ Top 2 clubs go up
If e.RowNumber <= 2 Then
e.BackgroundColour = Brushes.AliceBlue
End If
If e.ColumnNumber = 0 Then
If e.CellData.ToString = "Grimsby" Then
e.TextColour = Brushes.RoyalBlue
End If
End If
'\\ Bottom 2 columns relegation
If e.RowNumber >= 23 Then
e.BackgroundColour = Brushes.LightGray
End If
End Sub
(3) Raises an event to allow you to change the actual text in a cell:
Code:
Private Sub GridPrinter_QueryCellData(ByVal sender As Object, ByVal e As QueryCellDataEventArgs) Handles GridPrinter.QueryCellData
If e.ColumnNumber > 0 And e.CellText = "0" Then
e.CellText = "Zero"
End If
End Sub
Last edited by Merrion; Nov 4th, 2009 at 01:50 PM.
Re: DataGridPrinter - A class to print data grid in a nicely formatted way
Oops - because VS2008 is so much nicer a development environment I have been using it for all my code - guess i forgot to roll this one back for "publication"...