Reputation: 2924
I am working on a Windows Form to create a Employee Card Layout. In addition to that I have added a Button named "Print" which will Print the Panel Content. When I run the code It shows Error when Form loads:
Here is my code:
namespace SimpleReport
{
public partial class EmployeeCardForm : Form
{
//Declare following Object Variables
PrintDocument printdoc1 = new PrintDocument();
PrintPreviewDialog previewdlg = new PrintPreviewDialog();
Panel pannel = null;
public EmployeeCardForm()
{
InitializeComponent();
//declare event handler for printing in constructor
printdoc1.PrintPage += new PrintPageEventHandler(printdoc1_PrintPage);
}
Bitmap MemoryImage;
public void GetPrintArea(Panel pnl)
{
MemoryImage = new Bitmap(pnl.Width, pnl.Height);
Rectangle rect = new Rectangle(0, 0, pnl.Width, pnl.Height);
pnl.DrawToBitmap(MemoryImage, new Rectangle(0, 0, pnl.Width, pnl.Height));
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawImage(MemoryImage, 0, 0);
base.OnPaint(e);
}
void printdoc1_PrintPage(object sender, PrintPageEventArgs e)
{
Rectangle pagearea = e.PageBounds;
e.Graphics.DrawImage(MemoryImage, (pagearea.Width / 2) - (this.panel1.Width / 2), this.panel1.Location.Y);
}
public void Print(Panel pnl)
{
pannel = pnl;
GetPrintArea(pnl);
previewdlg.Document = printdoc1;
previewdlg.ShowDialog();
}
private void button1_Click(object sender, EventArgs e)
{
Print(this.panel1);
}
}
}
When I debugged the code I came to know that It crashes on first line of OnPaint Event. Please help me out.
Upvotes: 3
Views: 2275
Reputation: 18780
MemoryImage
is null before GetPrintArea()
has been called.
Try this:
protected override void OnPaint(PaintEventArgs e)
{
if (MemoryImage != null)
{
e.Graphics.DrawImage(MemoryImage, 0, 0);
}
base.OnPaint(e);
}
That's only if you don't want to draw it when it is null. Because it's null initially and then you set it in GetPrintArea()
. Depending on your circumstance, you could call GetPrintArea() instead of the null check or you could initialise MemoryImage immediately, it all depends on how you want it to work.
Upvotes: 3
Reputation: 3183
You never set your MemoryImage. In your printpage event, before calling DrawImage add GetPrintArea(pnl)
Upvotes: 0