3

従業員カード レイアウトを作成するために 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 イベントの最初の行でクラッシュすることがわかりました。私を助けてください。

4

2 に答える 2

3

MemoryImageGetPrintArea()が呼び出される前はnullです。

これを試して:

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

これは、nullのときに描画したくない場合のみです。最初はnullなので、で設定しGetPrintArea()ます。状況に応じて、nullチェックの代わりにGetPrintArea()を呼び出すか、MemoryImageをすぐに初期化することができます。これは、すべて、どのように機能させるかによって異なります。

于 2012-05-16T08:02:12.403 に答える
0

MemoryImageを設定することはありません。printpageイベントで、DrawImageを呼び出す前に、GetPrintArea(pnl)を追加します。

于 2012-05-16T08:01:17.370 に答える