【问题标题】:Print Preview Control used in a custom Print Preview Dialog自定义打印预览对话框中使用的打印预览控件
【发布时间】:2010-03-25 11:02:27
【问题描述】:

我已经使用 .NET 的 PrintDocument、PrintDialog 和 PrintPreviewDialog 类成功地为我的应用实现了打印和打印预览。

但是,我的应用程序使用工具包来改进标准 .NET 控件的外观。工具包中有大多数 .NET 控件的版本,但打印控件没有。

因此,为了确保这些控件的外观与应用程序的其余部分相匹配,我正在创建一个基于工具包表单的自定义 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

【问题讨论】:

    标签: c# .net printing


    【解决方案1】:

    我对这行有点疑惑:

      m_printPreviewControl = new PrintPreviewControl();
    

    您似乎没有附加或定位此控件。

    如果你把它和Designer放在一起,这行应该去掉,你应该在任何地方使用设计时控件的名称..

    如果你想手动创建它,你至少需要this.Controls.Add(m_printPreviewControl );这样的东西

    【讨论】:

    • 啊,多么愚蠢。那是从另一个测试中遗留下来的。就像你说的不应该在那里。删除它和所有的作品。往往只需要第二双眼睛!干杯。
    猜你喜欢
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2010-09-16
    相关资源
    最近更新 更多