我使用.NET的PrintDocument,PrintDialog和PrintPreviewDialog类成功地为我的应用程序实现了打印和打印预览。
但是我的应用程序使用工具包来改进标准.NET控件的外观。工具包中有大多数.NET控件的版本,但Print控件没有。
因此,为了确保这些控件的外观与应用程序的其余部分匹配,我将基于工具包表单创建自定义PrintPreviewDialog并在其中嵌入.NET PrintPrewviewControl。
我的问题是PrintPreviewControl始终显示“没有要显示的页面”。使用.NET PrintPreviewDialog让我无法正常工作,看不出我做错了什么。
这是一个.NET 2.0 PrintPreviewControl,因此我知道在分配PrintDocument后我需要调用InvalidatePreview()。但是,放置它的位置似乎并不重要,PrintPage事件处理程序永远不会被调用...
public class PrintEngine
{
...rest of class...
public PrintEngine()
{
m_printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage);
}
public void PrintPreview()
{
//ORIGINAL CODE USING .NET DIALOG WORK OK
//PrintPreviewDialog dlg1 = new PrintPreviewDialog();
//dlg1.Document = m_printDoc;
//PrepareImageForPrinting();
//dlg1.ShowDialog();
//CODE USING MY CUSTOM DIALOG DO NOT WORK?
MyPrintPreviewDialog dlg2 = new MyPrintPreviewDialog();
dlg2.Document = m_printDoc;
PrepareImageForPrinting(); //Creates the m_printImage List
dlg2.ShowDialog();
}
private void printDoc_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.DrawImage(m_printImages[m_currentPage], new Point(0, 0));
m_currentPage++;
e.HasMorePages = m_currentPage < m_pagesHigh;
}
}//end PrintEngine class
public class MyPrintPreviewDialog : KryptonForm
{
public PrintDocument Document
{
get { return m_printPreviewControl.Document; }
set
{
m_printPreviewControl.Document = value;
m_printPreviewControl.InvalidatePreview();
}
}
public MyPrintPreviewDialog()
{
InitializeComponent();
m_printPreviewControl = new PrintPreviewControl();
m_printPreviewControl.StartPage = 0;
}
private void MyPrintPreviewDialog_Load(object sender, EventArgs e)
{
m_printPreviewControl.Document.DefaultPageSettings = new PageSettings();
m_printPreviewControl.Document.PrinterSettings = new PrinterSettings();
m_printPreviewControl.InvalidatePreview();
}
}//end MyPrintPreviewDialog class
答案 0 :(得分:2)
我对这条线感到有些困惑:
m_printPreviewControl = new PrintPreviewControl();
您似乎没有附加或定位此控件。
如果您使用Designer放置它,则应删除此行,并且您应该在任何地方使用设计时控件的名称。
如果您想手动创建它,则至少需要this.Controls.Add(m_printPreviewControl );