2009-12-09 86 views
0

我在窗體上有一個dataGridView,並且有很多列和行。現在我想繪製dataGrid列和行來打印文檔,然後打印。但是,當printDocument的BeginPrint事件正在運行時,GridView的列和行是空的,儘管它不是。 什麼是錯誤?BeginPrint事件和dataGridView問題

private void printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) 
    { 
     try 
     { 
      strFormat = new StringFormat(); 
      strFormat.Alignment = StringAlignment.Near; 
      strFormat.LineAlignment = StringAlignment.Center; 
      strFormat.Trimming = StringTrimming.EllipsisCharacter; 

      arrColumnLefts.Clear(); 
      arrColumnWidths.Clear(); 
      iCellHeight = 0; 
      iRow = 0; 
      bFirstPage = true; 
      bNewPage = true; 

      // Calculating Total Widths 
      iTotalWidth = 0; 

      foreach (DataGridViewColumn dgvGridCol in dataGridView1.Columns) 
      { 
       iTotalWidth += dgvGridCol.Width; 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
    { 
     try 
     { 
      //Set the left margin 
      int iLeftMargin = e.MarginBounds.Left; 

      //Set the top margin 
      int iTopMargin = e.MarginBounds.Top; 
      //Whether more pages have to print or not 
      bool bMorePagesToPrint = false; 
      int iTmpWidth = 0; 

      //For the first page to print set the cell width and header height 
      if (bFirstPage) 
      { 
       foreach (DataGridViewColumn GridCol in dataGridView1.Columns) 
       { 
        iTmpWidth = (int)(Math.Floor((double)((double)GridCol.Width/
            (double)iTotalWidth * (double)iTotalWidth * 
            ((double)e.MarginBounds.Width/(double)iTotalWidth)))); 

        iHeaderHeight = (int)(e.Graphics.MeasureString(GridCol.HeaderText, 
           GridCol.InheritedStyle.Font, iTmpWidth).Height) + 11; 

        // Save width and height of headres 
        arrColumnLefts.Add(iLeftMargin); 
        arrColumnWidths.Add(iTmpWidth); 
        iLeftMargin += iTmpWidth; 
       } 
      } 
      //Loop till all the grid rows not get printed 
      while (iRow <= dataGridView1.Rows.Count - 1) 
      { 
       DataGridViewRow GridRow = dataGridView1.Rows[iRow]; 
       //Set the cell height 
       iCellHeight = GridRow.Height + 5; 
       int iCount = 0; 
       //Check whether the current page settings allo more rows to print 
       if (iTopMargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top) 
       { 
        bNewPage = true; 
        bFirstPage = false; 
        bMorePagesToPrint = true; 
        break; 
       } 
       else 
       { 
        if (bNewPage) 
        { 
         //Draw Header 
         e.Graphics.DrawString("Customer Summary", new Font(dataGridView1.Font, FontStyle.Bold), 
           Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - 
           e.Graphics.MeasureString("Customer Summary", new Font(dataGridView1.Font, 
           FontStyle.Bold), e.MarginBounds.Width).Height - 13); 

         String strDate = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString(); 
         //Draw Date 
         e.Graphics.DrawString(strDate, new Font(dataGridView1.Font, FontStyle.Bold), 
           Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - 
           e.Graphics.MeasureString(strDate, new Font(dataGridView1.Font, 
           FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Top - 
           e.Graphics.MeasureString("Customer Summary", new Font(new Font(dataGridView1.Font, 
           FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13); 

         //Draw Columns     
         iTopMargin = e.MarginBounds.Top; 
         foreach (DataGridViewColumn GridCol in dataGridView1.Columns) 
         { 
          e.Graphics.FillRectangle(new SolidBrush(Color.LightGray), 
           new Rectangle((int)arrColumnLefts[iCount], iTopMargin, 
           (int)arrColumnWidths[iCount], iHeaderHeight)); 

          e.Graphics.DrawRectangle(Pens.Black, 
           new Rectangle((int)arrColumnLefts[iCount], iTopMargin, 
           (int)arrColumnWidths[iCount], iHeaderHeight)); 

          e.Graphics.DrawString(GridCol.HeaderText, GridCol.InheritedStyle.Font, 
           new SolidBrush(GridCol.InheritedStyle.ForeColor), 
           new RectangleF((int)arrColumnLefts[iCount], iTopMargin, 
           (int)arrColumnWidths[iCount], iHeaderHeight), strFormat); 
          iCount++; 
         } 
         bNewPage = false; 
         iTopMargin += iHeaderHeight; 
        } 
        iCount = 0; 
        //Draw Columns Contents     
        foreach (DataGridViewCell Cel in GridRow.Cells) 
        { 
         if (Cel.Value != null) 
         { 
          e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font, 
             new SolidBrush(Cel.InheritedStyle.ForeColor), 
             new RectangleF((int)arrColumnLefts[iCount], (float)iTopMargin, 
             (int)arrColumnWidths[iCount], (float)iCellHeight), strFormat); 
         } 
         //Drawing Cells Borders 
         e.Graphics.DrawRectangle(Pens.Black, new Rectangle((int)arrColumnLefts[iCount], 
           iTopMargin, (int)arrColumnWidths[iCount], iCellHeight)); 

         iCount++; 
        } 
       } 
       iRow++; 
       iTopMargin += iCellHeight; 
      } 

      //If more lines exist, print another page. 
      if (bMorePagesToPrint) 
       e.HasMorePages = true; 
      else 
       e.HasMorePages = false; 
     } 
     catch (Exception exc) 
     { 
      MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

回答

1

此行添加到您的BeginPrint事件處理程序:

this.Show(); 

如果您現在看到一種新的形式彈出,一個空網格,您使用了錯誤的形式引用,以獲得印刷準備。如果這個新表單沒有響應,那麼你也遇到了線程問題。