2014-02-20 51 views
1

我想隱藏打印頁面中的列。隱藏打印頁面中的特定列c#

這裏是顯示ID行的影像仍清晰可見:

enter image description here

我想隱藏的ID列。

這裏是我正在使用的代碼,我已經聲明this.dataGridView.Columns["ID"].Visible = false,但ID列仍然可見。

private void PrintPreview(object sender, EventArgs e) 
     { 
      PrintPreviewDialog _PrintPreview = new PrintPreviewDialog(); 
      printDocument1.DefaultPageSettings.Landscape = true; 
      _PrintPreview.Document = printDocument1; 
      ((Form)_PrintPreview).WindowState = FormWindowState.Maximized; 
      _PrintPreview.ShowDialog(); 

      this.dataGridView1.Columns["ID"].Visible = false; 
     } 

private 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) 
      { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

     private void printDocument1_PrintPage(object sender, 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; 

       int width = 500; 

       int height = 90; 

       //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("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 = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString(); 

          //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(pb1.Image, new Rectangle(300, 0, width, 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) 
      { 
       MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

任何幫助我該如何解決這個問題?

謝謝!

您的回答將非常感謝!

回答

2

我認爲這個問題是在printDocument1_PrintPage

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++; 
} 

您遍歷ALL列和打印thier值。所以你應該跳過ID列。請記住,將特定列Visible屬性更改爲false將不會將其從dataGridView1.Columns集合中隱藏。

無論如何,一個簡單的方法來實現自己的目標:

foreach (DataGridViewColumn GridCol in dataGridView1.Columns) 
{ 
    if (GridCol.Name != "ID") 
    { 
     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++; 
    } 
} 
+0

謝謝你的回答。但是我又遇到了一個問題,列ID不見了,但ID號仍然存在,就像這張圖片:(我上傳到保管箱中):https://www.dropbox.com/s/gxagdwujkma3kb0/Capture.PNG 謝謝 – Kaoru

+0

@Kaoru對於'foreach(GridRow.Cells中的DataGridViewCell Cel)',您應該過濾屬於ID列的單元格。 (例如,您可以檢查「Cel.ColumnIndex」)。考慮重新設計你的邏輯。 – etaiso

+0

非常感謝您的先生。我會考慮重新設計我的這個打印頁面的邏輯:) – Kaoru

1

試着把你的這一行this.dataGridView1.Columns [「ID」]。Visible = false;作爲您的第一行PrintPreview方法,因爲當您撥打_PrintPreview.ShowDialog();將調用printDocument1_BeginPrint,因此該列是可見的。

+0

不,它也不起作用 – Kaoru

+0

在您已經顯示所有列的打印邏輯中,嘗試檢查不可見的列並嘗試它。 –

1

由於Mo.Ashfaq已經回答了,你這裏有一個邏輯錯誤

private void PrintPreview(object sender, EventArgs e) 
    { 
     ... 
     _PrintPreview.ShowDialog(); 

     this.dataGridView1.Columns["ID"].Visible = false; 
    } 

讓它這樣

private void PrintPreview(object sender, EventArgs e) 
    { 
     ... 
     this.dataGridView1.Columns["ID"].Visible = false; 
     _PrintPreview.ShowDialog(); 
     this.dataGridView1.Columns["ID"].Visible = true; // restore visibility 
    } 

接下來的事情是設置列隱形不妨礙列舉它(如etaiso回答),替換所有出現

foreach (DataGridViewColumn dgvGridCol in dataGridView1.Columns) 
{ 
    ... 
} 

foreach (var column in dataGridView1.Columns) 
    if(column.Visible) 
    { 
     ... 
    } 
0

儘量不具有ID列的參數在所有可見的是假性還是真性。

但是,正如etaiso所說,當您在所有行中執行循環時,您正在遍歷所有列。

所有你需要做的就是這種變化

   int iCount = 0; 

   int iCount = 1; 

這樣你跳過第一列在你的for循環和ID列,列0將不會出現在您的打印預覽