Click here to Skip to main content
15,885,546 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
I have designed a form with all labels that will be populated from the selected value of a datagrid of another window form and want to automatically print it without showing it. I set printDocument and printDialog on the form and use a button on the Form to print then it works properly but when I call button1_Click method of that form from another form as button1_Click(null, null) after making all controls public I am getting black page as a preview.

I have a gridview in Form1 and button1 in Form1. Form2 is arranged with levels how the invoice looks like. Want to print Form2 after populating with values of datagrid of Form1 and clicking button1.
Posted
Comments
Richard MacCutchan 2-Jan-15 8:24am    
You should use your debugger to find out what is happening in your click handler. It is most likely that you have failed to set some parameter that the print routine requires.
Duncan Edwards Jones 2-Jan-15 10:45am    
If you aren't going to show it, why have a form at all - why not just have a method that takes your selected data row and prints it?

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
 
Share this answer
 
v6
Comments
BillWoodruff 2-Jan-15 11:29am    
+5 Very thorough answer !
Sergey Alexandrovich Kryukov 2-Jan-15 11:40am    
Thank you, Bill.
—SA
Abhinav S 2-Jan-15 11:42am    
5.
Sergey Alexandrovich Kryukov 2-Jan-15 11:49am    
Thank you, Abhinav.
—SA
Maciej Los 2-Jan-15 15:06pm    
:joking: What are you trying to say? ;)
+5!!!
In addition to Solution 1, related to "form collaboration":

As the question turned out to be very popular, and my previous answers often were not well understood, probably were not clear enough, I decided to write a Tips/Trick article complete with detailed code samples and explanations: Many Questions Answered at Once — Collaboration between Windows Forms or WPF Windows.

—SA
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900