C# 值不能为null Windows窗体C中的异常#

C# 值不能为null Windows窗体C中的异常#,c#,.net,winforms,visual-studio-2010,C#,.net,Winforms,Visual Studio 2010,我正在使用Windows窗体创建员工卡布局。除此之外,我还添加了一个名为“打印”的按钮,用于打印面板内容。当我运行代码时,在加载表单时会显示错误: 这是我的密码: namespace SimpleReport { public partial class EmployeeCardForm : Form { //Declare following Object Variables PrintDocument printdoc1 = new PrintDocument();

我正在使用Windows窗体创建员工卡布局。除此之外,我还添加了一个名为“打印”的按钮,用于打印面板内容。当我运行代码时,在加载表单时会显示错误:

这是我的密码:

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);
    }
  }
}
当我调试代码时,我知道它在OnPaint事件的第一行崩溃。
请帮帮我。

你从来没有设置过记忆映像。在printpage事件中,在调用DrawImage之前,添加GetPrintArea(pnl)

MemoryImage
在调用
GetPrintArea()
之前为空

试试这个:

protected override void OnPaint(PaintEventArgs e)
{
    if (MemoryImage != null)
    {
        e.Graphics.DrawImage(MemoryImage, 0, 0);
    }
    base.OnPaint(e);
}

只有当它为空时,您才不想绘制它。因为它最初是空的,然后在
GetPrintArea()
中设置它。根据您的情况,您可以调用GetPrintArea()而不是空检查,或者可以立即初始化MemoryImage,这一切都取决于您希望它如何工作。

您说的是
位图MemoryImage
,您是否意识到绘制事件在您单击之前很久就触发了,并且
MemoryImage
此时必须为空。您是否仔细检查了代码以确保MemoryImage按预期创建?不用担心,只要当MemoryImage为空时,它确实是您想要做的。