Library tutorials & articles
Printing Reports in .NET
- Introduction
- Step by Step Introduction
- Report Document classes
- Report Document classes (contd.)
- Layouts
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.
Related articles
Related discussion
-
Binary Studio | software development outsourcing Ukraine
by shane124 (4 replies)
-
Chart insertation in a windows form...
by pdhanik (1 replies)
-
Point of Sale Developers: Hardware & C# SDK
by ManiGovindan (7 replies)
-
help with the remote frame buffer protocol from real VNC
by poison (0 replies)
-
Need help making a complete program editable, C# or .net I think
by davelee (1 replies)
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
-
Dec
9
GL.net Group Meeting - December 2009
Gloucester, United Kingdom
The beginning of this year holiday season will belong to mocks. Ronnie and Stephen will take us for a tour around exciting world of unit testing.
So complicated. Why not use RAQ Report? With it, users can print reports easily.
!--removed tag-->Hi, Is Maria still here ?
!--removed tag-->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
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 >
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.
????
????
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
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
Thanx for the great stuff you gave us for free.
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
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
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
This thread is for discussions of Printing Reports in .NET.