我自己写了OnPrintPage事件,然后预览很正常是两页,为什么点击预览窗口中的打印后,怎么总是打印最后一页,而且页码还是3
PrintDoc = new PrintDocument();
PrintDoc.PrintPage += new PrintPageEventHandler(this.OnPrintPage);
PrintDoc.DocumentName=_Title;
previewDialog.Document = PrintDoc;
previewDialog.ShowDialog();
previewDialog.Dispose();
为什么点击打印却打的与预览的不一样。

解决方案 »

  1.   

    如果不预览,直接打印,结果会正确。如果一定要预览再打印,需在OnPrintPage中设置初始化代码(当第一页时,已显示记录数=0,页面的一些设置还原,当打印到最后一页时,即HasMorePages=false,当前页初始化为1),因为点击预览后,多次进入OnPrintPage,页数已到2,记录数已到最后,再点击打印,又会进入OnPrintPage,而你没有初始化的话,已显示记录数已到最后,不会再有数据显示,而页数加一的话将会是第3页。
      

  2.   

    private void OnPrintPage(object sender, PrintPageEventArgs e)
    {
    while(true)
    {
                                        //PageInitialize()   以下2行
    LeavePageHeight=AvailablePageHeight;
             Current_Y=_PageSetup.Margin_Top ;
    if (Page==0)
    {
    //ReportInitialize(); 以下5行
                                                  Offset_X=_PageSetup.Margin_Left ;
                       RecordNumber=_Content.Count ;
                       Page=0;
                       CurrentRecord=0;
                       AvailablePageHeight=_PageSetup .Paper_Height-_PageSetup.Margin_Top -_PageSetup.Margin_Bottom ;
    Page++;
    #region Title
    if (_Title ._RowHeight>0)
    {
    PrintTitle(e);
    LeavePageHeight-=_Title ._RowHeight ;
    Current_Y+=_Title ._RowHeight ;
    }
    #endregion
    #region ReportHeader
    if (LeavePageHeight>=_ReportHeader ._RowHeight )
    {
    if (_ReportHeader._RowHeight>0)
    {
    PrintReportHeader(e);
    LeavePageHeight-=_ReportHeader._RowHeight ;
    Current_Y+=_ReportHeader._RowHeight ;
    }
    }
    #endregion
    #region PageHeader and Frame
    if (LeavePageHeight>=this._LineFrame ._RowHeight )
    {
    if (_PageHeader._RowHeight >0)
    {
    PrintPageHeaderText(e);
    PrintPageFrame(e);
    LeavePageHeight-=_LineFrame ._RowHeight ;
    Current_Y+=_LineFrame ._RowHeight ;
    }
    }
    #endregion
    #region Detail and Frame
    while (LeavePageHeight>=this._LineFrame ._RowHeight  && CurrentRecord<RecordNumber)
    {
    PrintPageDetail(e);
    CurrentRecord++;
    PrintPageFrame(e);
    LeavePageHeight-=_LineFrame ._RowHeight ;
    Current_Y+=_LineFrame ._RowHeight ;
    }
    #endregion
    }
    else
    {
    Page++;
    if (LeavePageHeight>=this._LineFrame ._RowHeight )
    {
    if (_PageHeader._RowHeight >0)
    {
    PrintPageHeaderText(e);
    PrintPageFrame(e);
    LeavePageHeight-=_LineFrame ._RowHeight ;
    Current_Y+=_LineFrame ._RowHeight ;
    }
    }
    while (LeavePageHeight>=this._LineFrame ._RowHeight && CurrentRecord<RecordNumber)
    {
    PrintPageDetail(e);
    CurrentRecord++;
    PrintPageFrame(e);
    LeavePageHeight-=_LineFrame ._RowHeight ;
    Current_Y+=_LineFrame ._RowHeight ;
    }
    } if (CurrentRecord<RecordNumber)
    {
    e.HasMorePages =true; }
    else
    {
    if (_ReportTailer._RowHeight >0)
    {
    PrintReportTailer(e);
    }
    e.HasMorePages =false;
    Page=0;
    break;
    }
    if (Page>=FromPage && Page<=ToPage) 
    {
    if (Page==ToPage) e.HasMorePages =false;
    break;
    } }
    }
      

  3.   

    在OnPrintPage中你是不是对一个stream对象进行的操作呀,
    在这个函数的最后:
    if(line != null)
      ev.HasMorePages = true;
    else
    {
      ev.HasMorePages = false;
      stream.Seek(0,SeekOrigin.Begin);   ///一定要加这一句,因为OnPrintPage在预览的时候也会被调用
    }