Click here to Skip to main content
6,597,576 members and growing! (23,412 online)
Email Password   helpLost your password?
Desktop Development » Printing » General     Intermediate

DataGrid Printing Class v1.0b

By Nidhi S

A DataGrid printing class.
VB, Windows, .NET 1.1VS.NET2003, Dev
Posted:31 May 2005
Views:127,376
Bookmarked:52 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
15 votes for this article.
Popularity: 5.20 Rating: 4.42 out of 5

1
1 vote, 6.7%
2
1 vote, 6.7%
3
3 votes, 20.0%
4
10 votes, 66.7%
5

Sample Image - UML_Design.jpg

UML design

Sample Image - Preview.jpg

Preview

Introduction

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.

Background

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.

Implementation

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).

Using the code

Grid Creation: Creating the Constructor for the Grid

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

Grid Printing

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

Current Todo:

  1. Fix - When grid is empty, header is not printed well.
  2. When grid is lager than the width of the page, continue to next.

Other DataGrid Printing Classes

Acknowledgements

Thanks to nashcontrol who has given me permission to upload the project converted into VB.NET.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Nidhi S


Member
Nidhi Shrivastava
B.Sc (Maths), M.Sc(Maths), PGDCA(NIIT)
Working as a freelance software developer.

Experienced in C# .NET, VB .NET, VB 6.0, SQL Server 2000, Java 2 SDK.

Worked with PMPCertify (home based) (pmpcertify.org).
Currently working with .NET and its technology for last 1 and half years. Previously worked with VB 6.0 and have done many projects using it.

Hobbies include reading, music and travelling.
Occupation: Web Developer
Location: India India

Other popular Printing articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 38 (Total in Forum: 38) (Refresh)FirstPrevNext
QuestionNew page for right margin [modified] PinmemberMichaelMCSE11:23 21 Oct '09  
GeneralMy vote of 2 Pinmemberterry nuttall6:41 2 Mar '09  
Questionhow to edit a grid data with dataset PinmemberMember 33452596:15 14 Sep '08  
Questionvb.net form printing problem Pinmemberraniranjith5:40 14 May '08  
AnswerRe: vb.net form printing problem PinmemberNidhi S20:58 20 May '08  
GeneralNICE ARTICLE BUT ANY PROGRESS ?? Pinmembergurdeeptoor10:24 23 Mar '08  
QuestionSMS in PDU mode PinmemberNko-c3:15 30 May '07  
GeneralSearch in a data base Pinmembervmarcial4:21 23 Mar '07  
GeneralRe: Search in a data base PinmemberNidhi S21:14 29 Mar '07  
QuestionPrinting header problem Pinmembermakeafirstmove3:16 26 Feb '07  
GeneralVery Useful Pinmemberkurienmanu@hotmail.com,2:37 10 Feb '07  
GeneralRe: Very Useful Pinmembermakeafirstmove1:22 26 Feb '07  
QuestionPortrait or Landscape PinmemberOumaBeskuit19:11 8 Feb '07  
GeneralMessage for Nidhi.s Pinmembercoolblim17:41 9 Jan '07  
Generalhow can i use vb.net code in asp.net Pinmemberfffffffffff3:24 8 Jan '07  
GeneralHeader for Columns missing Pinmembertony joseph david4:26 12 Dec '06  
GeneralRe: Header for Columns missing PinmemberNidhi S3:15 14 Dec '06  
Questionchanging the view of the datagrid PinmemberDBND7:53 20 Oct '06  
Questionviewing a particular row PinmemberDBND7:52 20 Oct '06  
QuestionChange the size of the columns Pinmembersax688:08 10 Oct '06  
AnswerRe: Change the size of the columns PinmemberNidhi S19:13 10 Oct '06  
QuestionRe: Change the size of the columns Pinmembersax681:20 11 Oct '06  
QuestionPrinting a grid with many columns PinmemberNko-c4:19 24 Aug '06  
AnswerRe: Printing a grid with many columns PinmemberNidhi S18:50 24 Aug '06  
GeneralExcellent, but if dataview.rowfilter Error PinmemberMXTRULA10:25 18 Jul '06  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin 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