I recently developed an application with quite a few standard reports. The reports all have a set selection criteria, and didn't need filtering, so no front end was necessary - just straight to the report.
I tried the
PrintPreviewDialog control, but it doesn't have a way to set the print properties (margins, orientation, printer etc.). I also have a form management component (included in the project) which automatically restores a form to its previous state (window state, position, size). I couldn't use this with a
I, therefore, needed a common method to replicate the
PrintPreviewDialog control - but adding in the missing functionality. So the
ucPrintBar was born.
Using the code
There is an example form included in the source which should hopefully expand and illustrate these instructions.
ucPrintBar is an extension of the toolstrip - with all the controls pre-added. To use it on a form, just add it to the form and you should see the toolstrip shown above. You will also need to add a
PrintDocument and a
ucFormManagement component. The
PrintDocument is obvious, but the
ucFormManagement component is used to automatically save and restore print properties (this is explained further later).
In the properties of the
ucPrintBar, you will need to assign the
Document property and the
FormManagement property as seen below. The
PreviewControl is unassigned at design time because it is assigned dynamically at runtime.
You will need a class variable for the
private System.Windows.Forms.PrintPreviewControl preview
ucPrintBar, you will need to create a
with the following functions:
private void ucPrintBar1_PrintPropertiesChanged()
private void setupReport()
this.preview = new System.Windows.Forms.PrintPreviewControl();
this.preview.Document = this.printDocument1;
this.preview.Dock = System.Windows.Forms.DockStyle.Fill;
this.preview.Location = new System.Drawing.Point(0, 25);
this.preview.Name = "preview";
this.ucPrintBar1.PreviewControl = this.preview;
setupReport function is also called from the form
The thing I had most difficulty with was refreshing the print preview after changing the print properties. The obvious things didn't work (calling
PreviewControl.Refresh, repainting the screen etc.), so in the end, I resorted to removing the
PreviewControl and recreating it in the
PrintPropertiesChanged event handler.
There you have it - all you have to do now is create the report itself.
A note on the ucFormManagement component
I like to have my forms open up with the same size and position as when I last used it. It irritates me when I have to resize a form every time I use it (and I know quite a few other people who think the same way).
So, all my applications use my
ucFormManagement component. All you have to do is drop the component on a form, and it automatically saves the five form state variables (
Width) to the registry. When the form is opened, the component restores the last values.
That's the automatic stuff. I also have the ability to manually store the form information if I need to. The component has a
SortedList<string, object> for additional non-standard information. I used this extra facility in the
ucPrintBar to store the print properties (Left Margin, Right Margin, Top Margin, Bottom Margin, Orientation). If you don't want to store the print properties between uses, just don't assign the
FormManagement property of the
ucPrintBar. Here's an example of how to add some additional form information:
Here's an example of how to retrieve the additional form information:
if (this.ucFormManagement1.Extras != null)
- 2nd May 06: Initial version.