Library tutorials & articles

Printing Reports in .NET

Step by Step Introduction

This page will take you through the process of using ReportPrinting library, step by step.

Create a DataView

The first step is to create a DateTable and DateView that serves as the source of data. The following code will create a table of some famous birthdays:

public static DataView GetDataView()
{
    DataTable dt = new DataTable("People");
    dt.Columns.Add("FirstName", typeof(string));
    dt.Columns.Add("LastName", typeof(string));
    dt.Columns.Add("Birthdate", typeof(DateTime));
    dt.Rows.Add(new Object[] {"Theodore", "Roosevelt",  new DateTime(1858, 11, 27)});
    dt.Rows.Add(new Object[] {"Winston",  "Churchill",  new DateTime(1874, 11, 30)});
    dt.Rows.Add(new Object[] {"Pablo",    "Picasso",    new DateTime(1881, 10, 25)});
    dt.Rows.Add(new Object[] {"Charlie",  "Chaplin",    new DateTime(1889,  4, 16)});
    dt.Rows.Add(new Object[] {"Steven",  "Spielberg",  new DateTime(1946, 12, 18)});
    dt.Rows.Add(new Object[] {"Bart",    "Simpson",    new DateTime(1987,  4, 19)});
    dt.Rows.Add(new Object[] {"Louis",    "Armstrong",  new DateTime(1901,  8,  4)});
    dt.Rows.Add(new Object[] {"Igor",    "Stravinski", new DateTime(1882,  6, 17)});
    dt.Rows.Add(new Object[] {"Bill",    "Gates",      new DateTime(1955, 10, 28)});
    dt.Rows.Add(new Object[] {"Albert",  "Einstein",  new DateTime(1879,  3, 14)});
    dt.Rows.Add(new Object[] {"Marilyn",  "Monroe",    new DateTime(1927,  6,  1)});
    dt.Rows.Add(new Object[] {"Mother",  "Teresa",    new DateTime(1910,  8, 27)});
    DataView dv = dt.DefaultView;
    return dv;
}

This function will return a DataView for a table of a dozen famous individuals and their birthdays.

Create a ReportMaker

The ReportPrinting.IReportMaker interface is used to create objects that setup a ReportDocument. The ReportMaker for this example is called SampleReportMaker1. It has one method to implement:

public void MakeDocument(ReportDocument reportDocument) {

Let's take a look at the implementation of this method step-by-step. First, it is a good idea to reset the TextStyle class. This class provides global styles for text blocks. Since the scope of this class is application wide, it should be reset to a known state.

     TextStyle.ResetStyles();  

As mentioned, the TextStyle class has several static, global styles that can be applied to different text blocks. These styles can each be customized. We'll change some fonts and colors just to show what's possible.

    // Setup the global TextStyles
    TextStyle.Heading1.FontFamily = new FontFamily("Comic Sans MS");
    TextStyle.Heading1.Brush = Brushes.DarkBlue;
    TextStyle.Heading1.SizeDelta = 5.0f; 
    TextStyle.TableHeader.Brush = Brushes.White;
    TextStyle.TableHeader.BackgroundBrush = Brushes.DarkBlue;
    TextStyle.TableRow.BackgroundBrush = Brushes.AntiqueWhite;
    TextStyle.Normal.Size = 12.0f;
    // Add some white-space to the page.  By adding a 1/10 inch margin
    // to the bottom of every line, quite a bit of white space will be added
    TextStyle.Normal.MarginBottom = 0.1f;

Using our class defined earlier, we'll get a dataview and set the default sort based on the values setup in a GUI.  (Note, this is a hack. Better encapsulation should be used to isolate the dialog, defined later, from this class.)

    // create a data table and a default view from it.
    DataView dv = GetDataView();
    // set the sort on the data view
    if (myPrintDialog.cmbOrderBy.SelectedItem != null)
    {
        string str = myPrintDialog.cmbOrderBy.SelectedItem.ToString();
        if (myPrintDialog.chkReverse.Checked)
        {
            str += " DESC";
        }
        dv.Sort = str;
    }

The next step is creating an instance of the ReportPrinting.ReportBuilder class. This object is used to simplify the somewhat complicated task of piecing together text, data, and the container sections that they go into.

    // create a builder to help with putting the table together.
    ReportBuilder builder = new ReportBuilder(reportDocument);

Creating a header and footer are quite easy with the buider class' five overloaded functions. This one creates a simple header with text on the left side (Brithdays Report) and on the right side (page #). The footer has the date centered.

    // Add a simple page header and footer that is the same on all pages.
    builder.AddPageHeader("Birthdays Report", String.Empty, "page %p");
    builder.AddPageFooter(String.Empty, DateTime.Now.ToLongDateString(), String.Empty);

Now, the real fun begins. We start a vertical, linear layout because every section from here should be added below the preceding section (see Layouts for more information).

    builder.StartLinearLayout(Direction.Vertical);

Now add two text sections. The first section added will be a heading (as defined by TextStyle.Heading1). The second section is just normal text (as defined by the TextStyle.Normal).

    // Add text sections
    builder.AddText("Birthdays", TextStyle.Heading1);
    builder.AddText("The following are various birthdays of people who " +
        "are considered important in history.");

Next, we add a section of a data table. The first line adds a data section with a visible header row. Then three column descriptors are added. These are added in the order that the columns are displayed. That is, LastName will be the first column, followed by FirstName, followed by Birthdate.

The first parameter passed to AddColumn is the name of the column in the underlying DataTable. The second parameter is the string as printed in the header row. The last three parameters describe the widths used. A max-width can be specified in inches. Optionally, the width can be auto-sized based on the header row and/or the data rows. In this case, with false being passed, no auto-sizing is being done.

    //
    Add a data section, then add columns builder.AddTable
    (dv, true);
    builder.AddColumn ("LastName", "Last Name", 1.5f, false, false);
    builder.AddColumn ("FirstName", "First Name", 1.5f, false, false);
    builder.AddColumn ("Birthdate", "Birthdate", 3.0f, false, false);

We set a format expression for the last column added (the date column). These format expressions are identical to those used by String.Format

    // Set the format expression to this string.
    builder.CurrentColumn.FormatExpression = "{0:D}";

And the very last thing is to finish the LinearLayout that was started earlier.

    builder.FinishLinearLayout();
}

That pretty much summarizes the class SampleReportMaker1.cs

Create a form for printing

There are only a handful of controls on the following form: a label, a combox box, a check box, and a usercontrol from ReportPrinting namespace called PrintControl.  This control has the four buttons you see at the bottom of the form.

Figure 2 - SampleDialog

This form also has an instance of ReportPrinting.ReportDocument class. This is a subclass of System.Drawing.Printing.PrintDocument. If you create the above form in a designer, here is the constructor required to create a new ReportDocument object.

private ReportDocument reportDocument;
public ReportPrinting.PrintControl PrintControls;
public System.Windows.Forms.ComboBox cmbOrderBy;
public System.Windows.Forms.CheckBox chkReverse;
public SamplePrintDialog1()
{
    InitializeComponent();
    this.reportDocument = new ReportDocument();
    this.PrintControls.Document = reportDocument;
    SampleReportMaker1 reportMaker = new SampleReportMaker1(this);
    this.reportDocument.ReportMaker = reportMaker;
    this.cmbOrderBy.Items.Clear();
    this.cmbOrderBy.Items.Add("FirstName");
    this.cmbOrderBy.Items.Add("LastName");
    this.cmbOrderBy.Items.Add("Birthdate");
}

First an instance is created with new ReportDocument(). This instance is assigned to the PrintControls.Document property. A SampleReportMaker1 object (defined above) is then created and assigned to the ReportDocument's ReportMaker property. The final bit of the constructor simply sets up the combobox.

Conclusion

That's all that is involved in printing a document.  Of course, you can use the standard PrintDialog, PrintPreview, and PageSettings dialogs on your own (without using the PrintControls UserControl).

This entire sample can be found in the download of the ReportPrinting library, along with many more.

Comments

  1. 24 Aug 2009 at 15:36

    So complicated. Why not use RAQ Report? With it, users can print reports easily.

  2. 02 Jun 2009 at 11:34

    Hi, Is Maria still here ?

  3. 04 Mar 2007 at 22:21
    Fist of all you have to learn how to program, but I think it's better that you learn how to read.

  4. 08 Jul 2006 at 02:52

    Simple, I hope, question - What and how do I add the "Library" to my C# VS2005 project?

    I.m new to C# and VS 2005.  This is my first project.  ReportPrinting appears to be just what I was looking for, but it doesn't run in VS 2005, yet I can execute the ReportDocumentTesting.exe from within the Debug directory.

    Thank you,

    Jim

  5. 27 Jun 2005 at 14:12
    Borland Delphi and Borland C++Builder users often ask us, “Which report generator to choose: either FreeReport or FastReport 2.*, or FastReport 3.*?”, “Why FastReport 2 and FastReport 3 both are available for registration?”

    We are always glad to help you with your choice. Moreover, everything is rather simple – answer some questions and the choice will be obvious.

    So:

    1.    Are you going to create application programs with report generator functions only for Windows? (in that case we advise you to decide only between FreeReport and FastReport 3)
    2.    Do you write free programs, go in for programming as a hobby – for yourself and do not intend (not plan yet) that this occupation will bring you profit? (in that case we advise you to use FreeReport –  a fully free solution, which even now has a more serious functionality than most of commercial report generators for Delphi. And the availability of detailed documentation /that is absolutely unique for free product/ allows us to recommend this solution even to beginners in programming).
    3.    Do you intend to create cross-platform application programs or programs for Linux via using Borland Kyilx development framework? Or do you prefer application suite, which partially Linux-based, and partially MS Windows-based? (In that case FastReport 2.* CLX or FastReport 2.* CLX + FastReport 2.* VCL bundle – remarkable for the full compatibility; moreover, FastReport 2.* VCL supports a great number of capabilities peculiar to MS Windows platform - will suit you.
    4.    Do you use high technology in your work, know XML advantages? Are you interested in multithreaded report building? Do you need the full set of functions that report generator possesses (beginning with turning of the text to any angle and floating of the text from one block to another and ending with export filters precisely set in different formats including such as PDF, HTML, XLS etc. and report servers creation for distributed corporative applications <detailed comparison table is here >? (Then the entire spectrum of FastReport 3 solutions is at your service)

    And some more additions:

    1.    FastReport 3 exists today only in VCL variant (that is why VCL is not pointed out in its name), whereas FastReport 2.5* exists both in VCL and CLX variants – that is why the variant in FastReport 2.5* name is pointed out obligatory.
    2.    There is no need to be afraid of becoming a “solution hostage” after choosing FastReport 2 or FreeReport. Both FastReport 2 and FreeReport contain built-in means for converting reports from FastReport 2 format into FastReport 3 format.
    3.    For all FastReport 2 and FastReport 3 users of earlier delivered variants a privileged transition to FastReport 3 (of any variants of delivering) for variation in prices is foreseen.
    4.    FastScript, which is delivered being included into FastReport 3 Standard and higher, may be used in applications and separately from FastReport 3.
  6. 12 Apr 2005 at 08:31
    • added Delphi 4-7, 2005, C++Builder 4-6 support
    • added FastReport 3 (*.fr3) format support in report designer

      ????


    ????



    FreeReport is a reporting tool component. It consists of report engine, designer and preview. Its capabilities are comparable with that of Crystal Reports. It is written on 100% Object Pascal and can be installed in Delphi 4-7,2005 and C++Builder 4-6.
     This version of FreeReport is based on FastReport ver. 2.32.
     ROYALTY-FREE with FULL source code


    See more here: http://www.fast-report.com

  7. 15 Oct 2004 at 16:24


    Hello,


    By now you probably figured it out, but you have to do something like this:


           dv = dt.DefaultView;
           SectionTable st = builder.AddTable(dv, false, 100.0f);
           st.SuppressHeaderRow = true;
           st.OuterPens = st.InnerPenHeaderBottom = st.InnerPenRow = null;
           builder.AddColumn("Col1", "", 1.5f);
           builder.CurrentColumn.RightPen = null;
           builder.AddColumn("Col2", "", 2.7f);
           builder.CurrentColumn.RightPen = null;


    I've been fighting with this library for the entire day, and I hope it helps you!


     -- LuisR

  8. 28 Jul 2004 at 08:37
    Hi Mike

    Thanx for the great stuff you gave us for free. It saved me centuries of my time.
    I hope you still read this coz I have a small problem. Please tel me how to remove grid when I print dataview.

    Regards
    Al
  9. 19 Jul 2004 at 02:17

    Some information on FastReport 3:
    - Rewritten class architecture.
    - Storing reports in XML format.
    - Full WYSIWYG (now for text objects too).
    - Text rotation 0..360 degrees.
    - Memo object supports simple html-tags (font color, b, i, u, sub, sup).
    - Styles, Text flow.
    - URLs, Anchors.
    - Dot matrix reports.
    - One script in the report (like an unit in the Delphi), Multi-language architecture allows you to use many languages
    (Pascal, C++, Basic, Java).
    - Access to any object inside your application (in case you've allowed this). Standard libraries to access to base classes,
    controls and forms. Easily expandable library architecture.
    - Debugger, Improved Object Inspector.
    - Zooming, Rulers, guides.
    - Wizard for base type reports.
    - Full Undo/Redo.


    Read more: http://fast-report.com/en/fr3.php


    Features comparison (compare FastReport 3 with the current version of FastReport):
    http://fast-report.com/en/comparison.php


    Price-list: http://fast-report.com/en/upgrade.php


    Download FastReport 3: http://www.fast-report.com/en/download.php

  10. 23 Jun 2004 at 01:05

    Hello all,


    I have a little .NET vs. VS 6 user control curiosity!  ^_^  any takers?  


    If I have a project that contains a user control that I made in VS6 and then want to convert it to VS.NET, can I still call the component /dll from within a test application that was created mainly in VB6?  Does anyone have exerience with the conversion of user controls - because when the project with the user control is converted to .Net, the user control code is totally gone in the .Net version of the project!


    Well a little insight would help me a long way!  
    Thanks guys,


    Maria

  11. 01 Jan 1999 at 00:00

    This thread is for discussions of Printing Reports in .NET.

Leave a comment

Sign in or Join us (it's free).

Mike Mayer Mike Mayer is a Microsoft MVP in Visual C#.
AddThis

Related podcasts

  • A Practical Look at Silverlight 2 Part 1

    Now that Silverlight 2 is at the Olympics and making a big splash, we wanted to explore this fascinating technology more. Microsoft Silverlight 2 is a cross-browser, cross-platform, and cross-device plug-in for delivering the next generation of .NET based media experiences and rich interactive ap...

Events coming up

  • Nov 18

    15 Minutes of Fame

    Dresher, United States

    This is a yearly tradition. We select 10 of the favorite speakers from monthly meetings, code camps, and hands on labs. Each one does a 15 minute talk on their favorite .NET technology. This is our 10th anniversary so we plan a gala event with special prizes and refreshments.

We'd love to hear what you think! Submit ideas or give us feedback