![]() |
Desktop Development »
Printing »
General
Intermediate
DataGrid Printing Class v1.0bBy Nidhi SA DataGrid printing class. |
VB, Windows, .NET 1.1VS.NET2003, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||

UML design

Preview
The DataGrid control is one of the worst things to work with, yet very needed. The real problem about this control is printing the grid. This class supports RightToLeft printing, colored and aligned grid printing.
I had to do a project that supports RightToLeft grid printing using VB.NET, but all the printing classes I found just didn't do the job. I found a project but it was written using C# and I had to write the project using VB.NET. So I have rewritten the same project in DataGrid Printing Class V1.0b by nashcontrol in VB.NET.
The main class is PrinterClass, it does the actual print. Grid is a class holding the DataGrid data, it's made of cells and headers. Cell represents a single cell in a grid with location, font alignment etc. Header represents a single header cell (inherits cell).
Public Sub New(ByVal TheGrid As DataGrid)
Try
'//get the Data in the grid
Dim TableGrid As DataTable = Nothing
If (TheGrid.DataSource.GetType() Is GetType(DataView)) Then
Dim ViewGrid As DataView = CType(TheGrid.DataSource, DataView)
TableGrid = ViewGrid.Table
Else
TableGrid = CType(TheGrid.DataSource, DataTable)
End If
'//set number of rows
row = TableGrid.Rows.Count
'set number of columns
'first check if the grid has tablestyle and columnstyle
'check for table styles
If (TheGrid.TableStyles.Count = 0) Then
'//create table style and column style
CreateColumnStyles(TheGrid, TableGrid)
Else
'//create column styles if there are none
If (TheGrid.TableStyles(TableGrid.TableName).GridColumnStyles.Count=0) Then
CreateColumnStyles(TheGrid, TableGrid
End If
End If
'//set number of columns
column = TheGrid.TableStyles(TableGrid.TableName).GridColumnStyles.Count
Cells = New Cell(Rows, Columns) {}
'Copy Cells
Dim i As Integer
For i = 0 To Rows - 1
Dim j As Integer
For j = 0 To Columns - 1
Cells(i, j) = New Cell(i, j, TheGrid.Font, _
TheGrid.TableStyles(TableGrid.TableName).GridColumnStyles(j).Alignment,_
New RectangleF(0, 0, TheGrid.GetCellBounds(i, j).Width, _
TheGrid.GetCellBounds(i, j).Height), TheGrid(i, j).ToString())
Next
Next
'init number of columns to headers
Headers = New Header(column) {}
SetHeaders(TheGrid, TableGrid)
'define grid colors
SetColors(TheGrid)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Private Function PrintDataGrid(ByVal g As Graphics) As Boolean
Dim sf As StringFormat = New StringFormat
PageCounter = PageCounter + 1
'if we want to print the grid right to left
If (bRightToLeft) Then
CurrentX = PrintDoc.DefaultPageSettings.PaperSize.Width_
- PrintDoc.DefaultPageSettings.Margins.Right
sf.FormatFlags = StringFormatFlags.DirectionRightToLeft
Else
CurrentX = PrintDoc.DefaultPageSettings.Margins.Left
End If
Dim i As Integer
For i = CurrentRow To PrintGrid.Rows - 1
Dim j As Integer
For j = 0 To PrintGrid.Columns - 1
'set cell alignment
Select Case (PrintGrid.Cell(i, j).Alignment)
'left
Case HorizontalAlignment.Left
sf.Alignment = StringAlignment.Near
Case HorizontalAlignment.Center
sf.Alignment = StringAlignment.Center
'right
Case HorizontalAlignment.Right
sf.Alignment = StringAlignment.Far
End Select
'advance X according to order
If (bRightToLeft) Then
'draw the cell bounds (lines) and back color
g.FillRectangle(New SolidBrush(PrintGrid.BackColor), _
CurrentX - PrintGrid.Cell(i, j).Width, CurrentY, _
PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height)
g.DrawRectangle(New Pen(PrintGrid.LineColor), _
CurrentX - PrintGrid.Cell(i, j).Width, CurrentY, _
PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height)
'draw the cell text
g.DrawString(PrintGrid.Cell(i, j).CText, _
PrintGrid.Cell(i, j).Font, New SolidBrush(PrintGrid.ForeColor),_
New RectangleF(CurrentX - PrintGrid.Cell(i, j).Width, _
CurrentY, PrintGrid.Cell(i, j).Width, _
PrintGrid.Cell(i, j).Height), sf)
'next cell
CurrentX -= PrintGrid.Cell(i, j).Width
Else
'draw the cell bounds (lines) and back color
g.FillRectangle(New SolidBrush(PrintGrid.BackColor), _
CurrentX, CurrentY, PrintGrid.Cell(i, j).Width, _
PrintGrid.Cell(i, j).Height)
g.DrawRectangle(New Pen(PrintGrid.LineColor), CurrentX, _
CurrentY, PrintGrid.Cell(i, j).Width, _
PrintGrid.Cell(i, j).Height)
'Draw text by alignment
g.DrawString(PrintGrid.Cell(i, j).CText, _
PrintGrid.Cell(i, j).Font, New SolidBrush(PrintGrid.ForeColor),_
New RectangleF(CurrentX, CurrentY, _
PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height), sf)
'next cell
CurrentX += PrintGrid.Cell(i, j).Width
End If
Next
'reset to beginning
If (bRightToLeft) Then
'right align
CurrentX = PrintDoc.DefaultPageSettings.PaperSize.Width_
- PrintDoc.DefaultPageSettings.Margins.Right
Else
'left align
CurrentX = PrintDoc.DefaultPageSettings.Margins.Left
End If
'advance to next row
CurrentY += PrintGrid.Cell(i, 0).Height
CurrentRow += 1
'if we are beyond the page margin (bottom)
'then we need another page,
'return true
If (CurrentY > PrintDoc.DefaultPageSettings.PaperSize.Height_
- PrintDoc.DefaultPageSettings.Margins.Bottom) Then
Return True
End If
Next
Return False
End Function
Thanks to nashcontrol who has given me permission to upload the project converted into VB.NET.
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 31 May 2005 Editor: Smitha Vijayan |
Copyright 2005 by Nidhi S Everything else Copyright © CodeProject, 1999-2009 Web18 | Advertise on the Code Project |