2013-03-07 55 views
0

我得到了一個窗體,其中有多個主要標籤和文本框的頁面,我試圖保留我已經在winform中的字體,到目前爲止我能夠打印的第一頁,但是當我嘗試添加其餘的控件時,它做了各種奇怪的東西,這是我的代碼的一部分,我把所有的東西打印,但並非面板中的所有控件顯示打印預覽。所以我發現面板上的控件沒有按順序,我需要做的是先創建打印頁面的數量,然後將控件放在這些打印頁面中。首先嚐試創建打印頁面以將控件添加到它的任何幫助。它將始終是4個打印頁面。打印時打印WinForform中的所有控件c#使用PrintDocument

int mainCount = 0; 
    public void printStuff(System.Drawing.Printing.PrintPageEventArgs e) 
    {    
     Font printFont = new Font("Arial", 9); 
     int dgX = dataGridView1.Left; 
     int dgY = dataGridView1.Top += 22; 
     double linesPerPage = 0; 
     float yPos = 0; 
     int count = 0; 

     float leftMargin = e.MarginBounds.Left; 
     float topMargin = e.MarginBounds.Top; 
     float bottomMargin = e.MarginBounds.Bottom; 
     StringFormat str = new StringFormat(); 

     linesPerPage = e.MarginBounds.Height/printFont.GetHeight(e.Graphics); 
     Control ctrl; 

     while ((count < linesPerPage) && (panel1.Controls.Count != mainCount))   
     { 
      ctrl = panel1.Controls[mainCount]; 
      yPos = topMargin + (count * printFont.GetHeight(e.Graphics)); 
      mainCount++; 
      count++; 
      if (ctrl is Label) 
      { 
       e.Graphics.DrawString(ctrl.Text, printFont, Brushes.Black, ctrl.Left + 5, ctrl.Top + 40); 
      } 
      else if (ctrl is TextBox) 
      { 
       e.Graphics.DrawString(ctrl.Text, printFont, Brushes.Black, ctrl.Left + 5, ctrl.Top + 40); 
       e.Graphics.DrawRectangle(Pens.Black, ctrl.Left, ctrl.Top + 40, ctrl.Width, ctrl.Height); 
      } 
     } 
     if (count > linesPerPage) 
     { 
      e.HasMorePages = true; 
     } 
     else 
     { 
      e.HasMorePages = false; 
     }    
    } 

    //Print 
    private void exportFileToolStripMenuItem_Click(object sender, EventArgs e) 
    {    
     printPreviewDialog1.Document = printDocument1; 
     printPreviewDialog1.ShowDialog(); 
    } 

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
    { 
     printStuff(e); 
    } 
+0

和究竟是這些確實奇怪的事情? – 2013-03-07 16:53:28

+0

在第一頁之後,它將整個頁面上的其他控件打印出來,並且很多頁面都是空白的。 – 2013-03-07 16:57:40

+0

該代碼假定* mainCount *與應打印控件的頁面有關。情況並非如此,控制的位置屬性是重要的。還必須對頁碼進行調整。並且BeginPrint缺失將計數器重置爲0.讓表格不適合放在紙上也非常不尋常。 – 2013-03-07 17:51:47

回答

0

在我看來,問題是,在隨後的頁面你是不是減去「頁偏移」形成的機頂位置。你基本上試圖在把控件放在打印頁面上時使用控件的屏幕座標,這顯然只適用於第一頁。在隨後的頁面,你需要通過減去量這是「總印刷表面那麼遠」相當於屏幕座標映射..

你將要修改這一行,例如:

e.Graphics.DrawString(ctrl.Text, printFont, Brushes.Black, ctrl.Left + 5, ctrl.Top + 40); 

到這樣的事情:

e.Graphics.DrawString(ctrl.Text, printFont, Brushes.Black, ctrl.Left + 5, ctrl.Top + 40 - pageOffset); 

其中pageOffset是應該計算每個頁面的變量的基礎上,可打印區域的高度:pageOffset = currentPageNumber * heightOfPrintableArea所以你還需要保持一個變量數字o ˚F頁打印,類似mainCount

當然,同樣的情況也適用於您的if語句的另一個分支:

e.Graphics.DrawString(ctrl.Text, printFont, Brushes.Black, ctrl.Left + 5, ctrl.Top + 40 - pageOffset); 
e.Graphics.DrawRectangle(Pens.Black, ctrl.Left, ctrl.Top + 40 - pageOffset, ctrl.Width, ctrl.Height); 
+0

我會嘗試,但我怎麼會得到可打印區域的高度? – 2013-03-07 17:07:15

+0

您可以嘗試使用e.MarginBounds.Height作爲可打印區域的高度。看看是否產生你正在尋找的結果。正如我所說,使用另一個變量來跟蹤你正在打印的頁面,每次調用printStuff(..) – 2013-03-07 17:10:35