2014-10-29 37 views
0

我想從數據網格視圖中打印文件。但是,一旦我點擊打印預覽,就會顯示錯誤信息並提示:Object reference not set to an instance of an object。這裏是來自錯誤:打印文件時未將對象引用設置爲對象的實例c#

arrColumnLefts.Clear(); 

在:

void printDocument1_BeginPrint(object sender, PrintEventArgs e) 
     { 
      try 
      { 
       strFormat = new StringFormat(); 
       strFormat.Alignment = StringAlignment.Center; 
       strFormat.LineAlignment = StringAlignment.Center; 
       strFormat.Trimming = StringTrimming.EllipsisCharacter; 

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

       iTotalWidth = 0; 

       foreach (DataGridViewColumn dgvGridCol in dataGridView1.Columns) 
       { 
        iTotalWidth += dgvGridCol.Width; 
       } 
      } 

      catch (Exception ex) 
      { 
       SystemManager.ShowMessageBox("Message: " + ex.Message, "Error", 1); 
      } 
     } 

和:

arrColumnLefts.Add(iLeftMargin); 

foreach (DataGridViewColumn GridCol in dataGridView1.Columns) 
          { 
           e.Graphics.FillRectangle(new SolidBrush(Color.Aqua), 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++; 
          } 

foreach (DataGridViewCell Cel in GridRow.Cells) 
         { 
          if (Cel.Value != null) 
          { 
           e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font, new SolidBrush(Cel.InheritedStyle.ForeColor = System.Drawing.Color.Blue), new RectangleF((int)arrColumnLefts[iCount], (float)iTopMargin, (int)arrColumnWidths[iCount], (float)iCellHeight), strFormat); 

           //Drawing Cells Borders 
           e.Graphics.DrawRectangle(Pens.Red, new Rectangle((int)arrColumnLefts[iCount], iTopMargin, (int)arrColumnWidths[iCount], iCellHeight)); 

           iCount++; 
          } 
         } 

在:

void printDocument1_PrintPage(object sender, PrintPageEventArgs e) 
     { 
      try 
      { 
       //Set the left margin 
       int iLeftMargin = e.MarginBounds.Left, iTopMargin = e.MarginBounds.Top, iTmpWidth = 0; 

       //Whether more pages have to print or not 
       bool bMorePagesToPrint = false; 

       //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) 
       { 
        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("Database Summary", new Font(dataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - e.Graphics.MeasureString("Database Summary", new Font(dataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13); 

          String strDate = this.textBox4.Text; 

          //Draw Date 
          e.Graphics.DrawString(strDate, new Font(dataGridView1.Font, FontStyle.Regular), Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(strDate, new Font(dataGridView1.Font, FontStyle.Regular), e.MarginBounds.Width).Width), e.MarginBounds.Top - e.Graphics.MeasureString("Database Summary", new Font(new Font(dataGridView1.Font, FontStyle.Regular), FontStyle.Regular), e.MarginBounds.Width).Height - 13); 

          //Draw Image 
          e.Graphics.DrawImage(pictureBox1.Image, new Rectangle((_screen.Width/3) - 50, 0, this.pictureBox1.Size.Width, this.pictureBox1.Size.Height)); 

          //Draw Columns  
          iTopMargin = e.MarginBounds.Top; 

          foreach (DataGridViewColumn GridCol in dataGridView1.Columns) 
          { 
           e.Graphics.FillRectangle(new SolidBrush(Color.Aqua), 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 = System.Drawing.Color.Blue), new RectangleF((int)arrColumnLefts[iCount], (float)iTopMargin, (int)arrColumnWidths[iCount], (float)iCellHeight), strFormat); 

           //Drawing Cells Borders 
           e.Graphics.DrawRectangle(Pens.Red, 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) 
      { 
       SystemManager.ShowMessageBox("Message: " + exc.Message, "Error", 1); 
      } 
     } 

下面是打印文件的完整代碼:

int iCellHeight, iTotalWidth, iRow, iHeaderHeight = 0; 

bool bFirstPage, bNewPage = false; 

ArrayList arrColumnLefts, arrColumnWidths = new ArrayList(); 

void PrintPreview(object sender, EventArgs e) 
     { 
      PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog(); 

      printDocument1.DefaultPageSettings.Landscape = true; 
      printPreviewDialog.Document = printDocument1; 
      ((Form)printPreviewDialog).WindowState = FormWindowState.Maximized; 
      printPreviewDialog.ShowDialog(); 
     } 

     void PrintFile(object sender, EventArgs e) 
     { 
      PrintDialog printDialog = new PrintDialog(); 

      printDocument1.DefaultPageSettings.Landscape = true; 
      printDialog.Document = printDocument1; 
      printDialog.UseEXDialog = true; 

      if (DialogResult.OK == printDialog.ShowDialog()) 
      { 
       printDocument1.DocumentName = "Document Page Print"; 
       printDocument1.Print(); 
      } 
     } 

     void printDocument1_BeginPrint(object sender, PrintEventArgs e) 
     { 
      try 
      { 
       strFormat = new StringFormat(); 
       strFormat.Alignment = StringAlignment.Center; 
       strFormat.LineAlignment = StringAlignment.Center; 
       strFormat.Trimming = StringTrimming.EllipsisCharacter; 

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

       iTotalWidth = 0; 

       foreach (DataGridViewColumn dgvGridCol in dataGridView1.Columns) 
       { 
        iTotalWidth += dgvGridCol.Width; 
       } 
      } 

      catch (Exception ex) 
      { 
       SystemManager.ShowMessageBox("Message: " + ex.Message, "Error", 1); 
      } 
     } 

     void printDocument1_PrintPage(object sender, PrintPageEventArgs e) 
     { 
      try 
      { 
       //Set the left margin 
       int iLeftMargin = e.MarginBounds.Left, iTopMargin = e.MarginBounds.Top, iTmpWidth = 0; 

       //Whether more pages have to print or not 
       bool bMorePagesToPrint = false; 

       //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) 
       { 
        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("Database Summary", new Font(dataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - e.Graphics.MeasureString("Database Summary", new Font(dataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13); 

          String strDate = this.textBox4.Text; 

          //Draw Date 
          e.Graphics.DrawString(strDate, new Font(dataGridView1.Font, FontStyle.Regular), Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(strDate, new Font(dataGridView1.Font, FontStyle.Regular), e.MarginBounds.Width).Width), e.MarginBounds.Top - e.Graphics.MeasureString("Database Summary", new Font(new Font(dataGridView1.Font, FontStyle.Regular), FontStyle.Regular), e.MarginBounds.Width).Height - 13); 

          //Draw Image 
          e.Graphics.DrawImage(pictureBox1.Image, new Rectangle((_screen.Width/3) - 50, 0, this.pictureBox1.Size.Width, this.pictureBox1.Size.Height)); 

          //Draw Columns  
          iTopMargin = e.MarginBounds.Top; 

          foreach (DataGridViewColumn GridCol in dataGridView1.Columns) 
          { 
           e.Graphics.FillRectangle(new SolidBrush(Color.Aqua), 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 = System.Drawing.Color.Blue), new RectangleF((int)arrColumnLefts[iCount], (float)iTopMargin, (int)arrColumnWidths[iCount], (float)iCellHeight), strFormat); 

           //Drawing Cells Borders 
           e.Graphics.DrawRectangle(Pens.Red, 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) 
      { 
       SystemManager.ShowMessageBox("Message: " + exc.Message, "Error", 1); 
      } 
     } 

謝謝各位!

您的回答非常感謝!

+0

可能重複[什麼是一個NullReferenceException,如何解決?(HTTP: //stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – 2014-10-29 03:02:40

回答

3

chanage

ArrayList arrColumnLefts, arrColumnWidths = new ArrayList(); 

ArrayList arrColumnLefts = new ArrayList(); 
ArrayList arrColumnWidths = new ArrayList(); 

OR

ArrayList arrColumnLefts = new ArrayList(), arrColumnWidths = new ArrayList(); 

UPDATE:

ArrayList arrColumnLefts, arrColumnWidths = new ArrayList(); 

,當你調用arrColumnLefts.Clear();你會得到空引用異常becouse未初始化arrColumnLefts等於

ArrayList arrColumnLefts; 
ArrayList arrColumnWidths = new ArrayList(); 

+0

謝謝。先生,這是有效的。但是,我有一個問題。爲什麼我不能寫'ArrayList arrColumnLefts,arrColumnWidths = new ArrayList',並且在Visual Studio允許我們這樣做時出現錯誤?同時,對於'int a,b,c,d = 0'這是行得通的嗎? – 2014-10-29 02:35:45

+1

從只有arrColumnWidths初始化爲'new ArrayList',arrColumnLefts仍然具有空值; – Damith 2014-10-29 02:37:12

+0

@UnknownUser你聲明瞭2種類型。但是你只是初始化/創建一個對象。這就是它被允許的原因。看一下上面Damith的答案中的第三個選項。 – deathismyfriend 2014-10-29 02:37:39

1

變化

ArrayList arrColumnLefts, arrColumnWidths = new ArrayList(); 

ArrayList arrColumnLefts = new ArrayList(); 
ArrayList arrColumnWidths = new ArrayList(); 

第一行只初始化第二的ArrayList

相關問題