2014-02-20 2 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++; 
} 

. 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 셀)'에 대해 동일한 작업을 수행하면 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 
    } 

다음 항목은 보이지 않는 설정 열이 그것을 열거하는 것을 막지 않습니다 (에타이오가 답변 한대로), 바꾸기 모든

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

표시가 허위 또는 진실되고에 전혀 ID 컬럼의 매개 변수를 가지고 있지 시도로

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

을 발생.

그러나 etaiso에 따르면 모든 행에서 루프를 실행할 때 모든 열을 반복하고 있다고합니다.

당신이해야 할 모든

당신이 루프 ID 열에 대한 귀하의 첫 번째 열을 건너

   int iCount = 0; 

   int iCount = 1; 

그런 식으로

에이 변화, 열 0에 표시되지 않습니다 인쇄 미리보기