First of all, it's important to realize that forms are designed to be shown on screen, not printed; and the printer if very different device. You cannot resize, scroll, zoom or pan on a printed page, click on controls, drill down… So, in most cases, it's better to print not the form, but just the data presented on a form, using the class
PrintDialog
:
http://msdn.microsoft.com/en-us/library/system.windows.forms.printdialog%28v=vs.110%29.aspx[
^].
Still, simplified printing of a form is on high demand, so you can see, for example, some of these CodeProject articles:
FormPrint as a simple class[
^],
Print Windows Forms w/o using API[
^],
Form Print Control[
^],
Simplified .NET Printing in C#[
^],
A component that prints any control, including ListViews, TreeViews, DataGridViews, and Forms[
^],
Printing a Form in a report fashion (release 2.2)[
^].
I hope you will see that the issue of "printing from another form" is irrelevant here. In case you won't, please understand that this is a very basic and elementary issue of
form collaboration, popular question. The most robust solution is implementation of an appropriate interface in form class and passing the interface reference instead of reference to a "whole instance" of a Form. Please see my past solution for more detail:
How to copy all the items between listboxes in two forms[
^].
Please also see other solutions in this discussion. If the application is simple enough, the solution could be as simple as declaring of some
internal
property in one form and passing a reference to the instance of one form to the instance of another form. For more complex projects, such violation of strictly encapsulated style and
loose coupling could add up the the
accidental complexity of the code and invite mistakes, so the well-encapsulated solution would be preferable.
Please see also:
http://en.wikipedia.org/wiki/Accidental_complexity[
^],
http://en.wikipedia.org/wiki/Loose_coupling[
^].
Happy New Year!
—SA