Skip to main content
Email Password   helpLost your password?

UML Design

Sample Image

Preview

Sample Image

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, but all the printing classes I found just didn't do the job. So, I made a new one...

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

public Grid(DataGrid TheGrid)
{
    try
    {
        //get the Data in the grid

        DataTable TableGrid = (DataTable)TheGrid.DataSource;

        //set number of rows

        rows = TableGrid.Rows.Count;

        //set number of columns

        //first check if the grid has tablestyle and columnstyle


        CreateColumnStyles(TheGrid,TableGrid);

        if (TheGrid.TableStyles[TableGrid.TableName].GridColumnStyles.Count>0)
            columns = 
              TheGrid.TableStyles[TableGrid.TableName].GridColumnStyles.Count;

        //init number of columns to headers

        Headers = new Header[Columns];

        SetHeaders(TheGrid,TableGrid);

        Cells = new Cell[Rows,Columns];

        //Copy Cells

        for (int i=0;i<Rows;i++)
        {
            for (int j=0;j<Columns;j++)
            {
                Cells[i,j] = new Cell(i, j, TheGrid.Font, 
                   TheGrid.GetCellBounds(i,j), TheGrid[i,j].ToString());
            }
        }

        //define grid colors

        SetColors(TheGrid);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

Grid Printing

private void PrintDataGrid(Graphics g)
{
    StringFormat sf = new StringFormat();

    //if we want to print the grid right to left

    if (bRightToLeft)
    {
        CurrentX = PrintDoc.DefaultPageSettings.PaperSize.Width - 
        PrintDoc.DefaultPageSettings.Margins.Right;

        sf.FormatFlags = StringFormatFlags.DirectionRightToLeft;
    }
    else
    {
        CurrentX = PrintDoc.DefaultPageSettings.Margins.Left;
    }

    for (int i=0;i<PrintGrid.Rows;i++)
    {
        for (int j=0;j<PrintGrid.Columns;j++)
        {
            //set cell alignment

            switch (PrintGrid[i,j].Alignment)
            {
                    //left

                case HorizontalAlignment.Left:
                    sf.Alignment = StringAlignment.Near;
                    break;

                    //center

                case HorizontalAlignment.Center:
                    sf.Alignment = StringAlignment.Center;
                    break;

                    //right

                case HorizontalAlignment.Right:
                    sf.Alignment = StringAlignment.Far;
                    break;
            }

            //advance X according to order

            if (bRightToLeft)
            {
                //draw the cell bounds (lines)

                g.DrawRectangle(Pens.Black,CurrentX - PrintGrid[i,j].Width,
                CurrentY,PrintGrid[i,j].Width,PrintGrid[i,j].Height);

                //draw the cell text

                g.DrawString(PrintGrid[i,j].Text,
                   PrintGrid[i,j].Font,Brushes.Black,
                   new RectangleF(CurrentX - PrintGrid[i,j].Width, 
                   CurrentY, PrintGrid[i,j].Width,
                   PrintGrid[i,j].Height),sf);

                //next cell

                CurrentX -=PrintGrid[i,j].Width;

            }
            else
            {
                //draw the cell bounds (lines)

                g.DrawRectangle(Pens.Black ,CurrentX,CurrentY, 
                     PrintGrid[i,j].Width,PrintGrid[i,j].Height);

                //draw the cell text

                //Draw text by alignment

                    
                g.DrawString(PrintGrid[i,j].Text,PrintGrid[i,j].Font, 
                     Brushes.Black, new RectangleF(CurrentX,CurrentY, 
                     PrintGrid[i,j].Width,PrintGrid[i,j].Height),sf);

                //next cell

                CurrentX +=PrintGrid[i,j].Width;
            }

        }

        //reset to beginning

        if (bRightToLeft)
        {
            //right align

            CurrentX = PrintDoc.DefaultPageSettings.PaperSize.Width - 
                       PrintDoc.DefaultPageSettings.Margins.Right;
        }
        else
        {
            //left align

            CurrentX = PrintDoc.DefaultPageSettings.Margins.Left;
        }

        //advance to next row

        CurrentY = CurrentY + PrintGrid[i,0].Height;
    }
}

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

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
Generalexcellent + small thing Pin
xor.be
0:37 15 Nov '07  
Generalinvoice datagrid printing? Pin
geee
16:56 27 Jun '07  
GeneralRe: invoice datagrid printing? Pin
nashcontrol
22:44 27 Jun '07  
GeneralRe: invoice datagrid printing? Pin
geee
22:54 27 Jun '07  
GeneralPreview Shows Empty Page Pin
scptech
6:38 5 May '07  
GeneralRe: Preview Shows Empty Page Pin
nashcontrol
12:34 5 May '07  
Questionasp.net Pin
H.Riazi
22:14 3 Dec '06  
GeneralDataGridColumnStyles Problem Pin
clueless23
22:24 26 Nov '06  
GeneralPrintings cell values formatted like in datagrid Pin
Senol Akbulak
5:41 28 Jul '06  
QuestionProblem in print preview [modified] Pin
v_sadeghpoor
14:07 14 Jun '06  
GeneralGrid Column Styles does not work Pin
project_manager
1:14 14 Jun '06  
GeneralNull text does not print Pin
project_manager
20:52 13 Jun '06  
Generalfit the datagrid Pin
Trimix
16:29 28 Feb '06  
GeneralI don't understand Pin
nashcontrol
11:22 9 Mar '06  
GeneralConversion to DataGridView Pin
Nice Life
3:12 23 Feb '06  
GeneralRe: Conversion to DataGridView Pin
Pink Floyd
11:17 14 Mar '06  
GeneralRe: Conversion to DataGridView Pin
lilyminako
16:08 14 Mar '06  
GeneralRe: Conversion to DataGridView Pin
Djeez
23:47 14 Mar '06  
GeneralRe: Conversion to DataGridView Pin
mariadelapaz
10:40 27 Mar '06  
GeneralRe: Conversion to DataGridView Pin
Waruna Rajapakse
0:45 6 Jun '06  
GeneralRe: Conversion to DataGridView Pin
karan_23_j
20:54 11 Jun '06  
GeneralRe: Conversion to DataGridView Pin
karan_23_j
20:48 11 Jun '06  
GeneralRe: Conversion to DataGridView Pin
Nice Life
5:58 13 Jul '06  
GeneralActual print doesn't how data grid Pin
yarowave
16:34 12 Feb '06  
GeneralRe: Actual print doesn't how data grid Pin
Nice Life
1:57 23 Feb '06  


Last Updated 27 Feb 2006 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009