2010-03-25 4 views
1

J'ai implémenté avec succès l'impression et l'aperçu avant impression pour mon application à l'aide des classes PrintDocument, PrintDialog et PrintPreviewDialog de .NET.Aperçu avant impression Contrôle utilisé dans une boîte de dialogue Aperçu avant impression personnalisée

Cependant, mon application utilise une boîte à outils pour améliorer l'apparence des contrôles standard .NET. Il existe des versions de la plupart des contrôles .NET dans la boîte à outils, mais aucune pour les contrôles d'impression.

Par conséquent, pour que l'apparence de ces commandes corresponde au reste de l'application, je crée un PrintPreviewDialog personnalisé basé sur un formulaire de boîte à outils et intégrant un .NET PrintPrewviewControl.

Mon problème est que le PrintPreviewControl affiche toujours "Aucune page à afficher". Je n'ai eu aucun problème pour que cela fonctionne avec le .NET PrintPreviewDialog et je ne vois pas ce que je fais de mal.

Ceci est un .NET 2.0 PrintPreviewControl et donc je sais que j'ai besoin d'appeler InvalidatePreview() après avoir assigné le PrintDocument. Cependant, il ne semble pas où que je la place, le gestionnaire d'événements PrintPage ne sera jamais appelé ...

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 

Répondre

2

Je suis un peu perplexe par cette ligne:

m_printPreviewControl = new PrintPreviewControl(); 

Vous n'avez pas semblent attacher ou positionner ce contrôle.

Si vous l'avez placé le doit être retiré Designer, cette ligne, et vous devez utiliser le nom du contrôle designtime partout ..

Si vous voulez créer, vous devez manuellement atr moins quelque chose comme this.Controls.Add(m_printPreviewControl);

+0

Arggh, comment stupide. C'était laissé d'un autre test. Comme vous dites ne devrait pas être là. Supprimé et tout fonctionne. Une deuxième paire d'yeux est souvent tout ce qu'il faut! à votre santé. – Kildareflare

Questions connexes