Introduction
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
PrintPreviewDialog
control.
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.
The
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
PreviewControl
:
private
System.Windows.Forms.PrintPreviewControl preview
For the
ucPrintBar
, you will need to create a
PrintPropertiesChanged
event:
this
.ucPrintBar1.PrintPropertiesChanged +=
new
printPropertiesChanged(
this
.ucPrintBar1_PrintPropertiesChanged);
with the following functions:
private
void
ucPrintBar1_PrintPropertiesChanged()
this
.Controls.Remove(
this
.preview);
this
.setupReport();
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;
this
.Controls.Add(
this
.preview);
this
.ucPrintBar1.loadDefaults();
The
setupReport
function is also called from the form
Load
event.
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 (
WindowState
,
Top
,
Left
,
Height
,
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:
this
.ucFormManagement1.addExtra(
"
LeftMargin"
,
this
.document.DefaultPageSettings.Margins.Left);
Here's an example of how to retrieve the additional form information:
if
(
this
.ucFormManagement1.Extras !=
null
)
if
(
this
.ucFormManagement1.Extras.ContainsKey(
"
LeftMargin"
))
leftMargin =
Convert.ToInt32(
this
.ucFormManagement1.Extras[
"
LeftMargin"
]);
History
2
nd
May 06: Initial version.
Sorry for my English
this very good code! but, work with vb.net?? end location property not work!
please... help me!
Cristiano F. Moura
www.vbsolutions.com.br
[email protected]
-- modified at 11:30 Thursday 29th June, 2006
Sign In
·
View Thread
Hi Cristiano, thanks for your comment. My apologies if I try to tell you things you already know, but I'm not completely sure what you're asking.
I don't have a specific vb version, but if you compile the c# project and reference the .dll that has been created it should work with vb the same way as any other control off your tool bar.
To add an item to the tool bar:
- Right click & select "Choose Items..."
- Click on "Browse..." and select the .dll that was created when you compiled.
I'm not sure what you mean by "end location" property. Do you mean the "location" property? If this is what you mean, then if you change the "Dock" property you can change the location.
My control is derived from a toolstrip control - and this automatically docks at the top of the screen by default.
Let me know if this doesn't help or if you need any other information.
MikeP
Sign In
·
View Thread