Library tutorials & articles

Printing Reports in .NET

Report Document classes (contd.)

ReportBuilder

ReportBuilder assists with the building of a report. This class is the main interface between your code and the ReportPrinting library. In many cases, you will never explicitly create any of the above objects.  Instead, the ReportBuilder will create them for you.

To instantiate a ReportBuilder, you must provide the ReportDocument to be built. Then you can call its various Add methods to sequentially add pieces to a report document.

Example:

The following example shows the creation of a report using the ReportBuilder. The following methods would be part of a class that implements IReportMaker (this is from example1 in the sample project).

private 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)});
    return dt.DefaultView;
    }
public void MakeDocument(ReportDocument reportDocument)
{
    // Clear the document
    reportDocument.ClearSections();
    // create a data table and a default view from it.
    DataView dataView = this.GetDataView();
    // create a builder to help with putting the table together.
    ReportBuilder builder = new ReportBuilder(reportDocument);
   
    // 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);
    builder.StartLinearLayout(Direction.Vertical);
    // Add text sections
    builder.AddTextSection("Birthdays", TextStyle.Heading1);
    builder.AddTextSection("The following are various birthdays of people who "
        + "are considered important in history.");
    // Add a data section, then add columns
    builder.AddDataSection(dataView, 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);
    // Set the format expression to this string.
    builder.CurrentColumn.FormatExpression = "{0:D}";
    builder.FinishLinearLayout();
       
}

IReportMaker

IReportMaker is an interface used to implement the strategy design pattern. An object that implements IReportMaker can be added to a ReportDocument. When the document is about to be printed, it automatically calls the single method MakeDocument(). The above example shows an implementation of that method to print a one-page report.

For example, you could have an application that can print either detailed reports or a shorter overview. The logic to make each of these reports would be located in separate classes.  Each class would implementing the IReportMaker interface. Your print dialog could have a "Print What" combo box to allow the user to select the type of report, and use the selection in the combo box to associate the correct implementation of IReportMaker with the ReportDocument.

Print Dialogs

The print dialog guides the user through the printing process. Most applications have some options that affect what is printed and how it is printed. Most windows applications customize the standard PrintDialog, adding an additional section at the bottom for various options. There are articles on extending the standard PrintDialog using MFC, but Ive yet to find anything for .NET. If someone creates a .NET control that looks like a standard PrintDialog and could easily be added to new Forms to create a customized PrintDialog or knows of some other way to extend the functionality of the .NET PrintDialog, please let me know.

PrintControl

To make printing easy for my applications, I created this very basic control that can be dropped onto any form. It gives the user options to setup, preview, submit (ok) or cancel. Providing a preview button and a page setup button on a print dialog are not standard in the windows interface, but I wish they were. So this control provides that functionality to your print dialog. Note, you can still provide access via a File menu (File | Print Preview, File | Page Setup).

Figure 3 - PrintControl user control

The control uses the following dialogs associated with printing:

  • PrintPreviewDialog
  • PageSetupDialog
  • PrintDialog

To use the print control, place it on a form. Set the Document property to a valid PrintDocument. (it doesnt have to just be the ReportDocument described earlier). Thats it!

You can customize a few things with the following properties:

  • ShowStatusDialog - The progress of the print job is shown in a status dialog. Default is true.
  • PrintInBackground - Indicates that printing should be done in the background. Default is true.
  • Printing - This event is raised prior to printing. It allows user code to setup for printing. (This is useful for dumping data from the GUI to a helper class, for instance).

Print Dialog with PrintControl

A sample form with a PrintControl is shown below. This dialog allows a user to select tables to print from the Northwind sample database.

Figure 4 - A dialog to prompt user for print settings and give them a chance to preview and setup the page.

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