2015-01-02 4 views
0

DataGridview가 있고 itextsharp를 사용하여 pdf에 선택된 행과 열만 내보내야합니다. 전체 datagridview 및 선택한 행만 내보낼 수 있습니다.선택한 행 및 열 내보내기 datagridview

문제 1. 행을 역순으로 내보내고 체크 한 방법은 아닙니다. (예 : I 행을 확인 ID 1, 5, 8, PDF에서 8, 5, 1) 지금은 텍스트 상자에 값을로드 할 수 FullRowSelect을 사용하기 때문에

내가 의 selectionMode을 변경하지 않으 선택한 행을 내보낼 수 있습니다. 가능한 답을 찾았습니다 : Get selected Row/Columns Count without Setting Selection Mode하지만 사용할 수 없습니다 ..

문제점 2. 내보낼 열과 행을 선택해야합니다.

private void exportDgvPDF(DataGridView dgvLoadAll, string filename) 
    { 
     BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, BaseFont.EMBEDDED); 

     iTextSharp.text.Font text = new iTextSharp.text.Font(bf, 11, iTextSharp.text.Font.NORMAL); 

     Document doc = new Document(PageSize.A2.Rotate(), 1, 1, 1, 1); 
     PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(filename, FileMode.Create)); 
     doc.Open(); 

     // I need to remove 21 columns since I have lots invisible "useless" columns .. will work on that later 
     PdfPTable pdftable = new PdfPTable(dgvLoadAll.ColumnCount - 21); 

     for (int j = 0; j < dgvLoadAll.Columns.Count - 21; j++) 
     { 
      PdfPCell cell = new PdfPCell(new Phrase(dgvLoadAll.Columns[j].HeaderText, text)); 
      cell.BackgroundColor = BaseColor.LIGHT_GRAY; 
      pdftable.AddCell(cell); 
     } 

     pdftable.HeaderRows = 0; 
     for (int i = 0; i < dgvLoadAll.SelectedRows.Count; i++) 
     //for (int i = 0; i < dgvLoadAll.Rows.Count; i++) 
     { 
      for (int k = 0; k < dgvLoadAll.Columns.Count - 21; k++) 
      { 

       if (dgvLoadAll[k, i].Value != null) 
       { 
        pdftable.AddCell(new Phrase(dgvLoadAll.SelectedRows[i].Cells[k].Value.ToString(), text)); 
        //pdftable.AddCell(new Phrase(dgvLoadAll[k, i].Value.ToString(), text)); 

       } 
      } 
     } 

     //float[] widths = new float[] { 15f, 50f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f }; 

     // pdftable.SetWidths(widths); 
     doc.Add(pdftable); 
     doc.Close(); 
    } 

답변

0

내가 그것을 알아 냈 :

여기 내 DGV를 내보낼 내 코드입니다. 다음은 itextsharp를 사용하여 pdf에 선택된 행과 열을 내 complet 솔루션으로 내보내기하는 것입니다.

내보낼 열을 선택하려면 ColumnHeaderMouseClick 이벤트를 사용합니다. 컬럼을 정렬 할 수 없게해야합니다. 선택한 열 인덱스를 목록 columnList에 추가합니다. 이미이 색인이있는 경우 추가되지 않습니다.

  private void dgvLoadAll_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
    { 

     DataGridViewColumn dataGridViewColumn = dgvLoadAll.Columns[e.ColumnIndex]; 

     if (columnsList.Contains(e.ColumnIndex)) 
     { 
      columnsList.Remove(e.ColumnIndex); 
      dataGridViewColumn.HeaderCell.Style.BackColor = SystemColors.Control; 
     } 
     else 
     { 
      columnsList.Add(e.ColumnIndex); 
      dataGridViewColumn.HeaderCell.Style.BackColor = SystemColors.Highlight; 
     } 
    } 

유사 나는 목록 rowsselected를 만듭니다. 다음

 foreach (DataGridViewRow r in dgvLoadAll.SelectedRows) 
     { 
      rowsselected.Add(r.Index); 
     } 

주요 내보내기 기능 :

  BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, BaseFont.EMBEDDED); 
      iTextSharp.text.Font text = new iTextSharp.text.Font(bf, 11, iTextSharp.text.Font.NORMAL); 

      Document doc = new Document(PageSize.A2.Rotate(), 1, 1, 1, 1); 
      PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(filename, FileMode.Create)); 
      doc.Open(); 

      // sort selected columns and rows indexes in order to be exported how they are viewed in datagridview 
      columnsList.Sort(); 
      rowsselected.Sort(); 

      PdfPTable pdftable = new PdfPTable(columnsList.Count); 
      foreach (int columnindex in columnsList) 
      { 
       PdfPCell cell = new PdfPCell(new Phrase(dgvLoadAll.Columns[columnindex].HeaderText, text)); 
       cell.BackgroundColor = BaseColor.LIGHT_GRAY; 
       pdftable.AddCell(cell); 
      } 

      pdftable.HeaderRows = 0; 

      foreach (int rowindex in rowsselected) 
      { 
       foreach (int columnindex in columnsList) 
       { 
        if (dgvLoadAll[columnindex, rowindex].Value != null) 
        { 
         pdftable.AddCell(new Phrase(dgvLoadAll.Rows[rowindex].Cells[columnindex].Value.ToString(), text)); 
        } 
       } 
      } 
      //float[] widths = new float[] { 15f, 50f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f, 40f }; 
      // pdftable.SetWidths(widths); 
      doc.Add(pdftable); 
      doc.Close(); 
      rowsselected.Clear(); 

당신은 당신이 예를 들어, 열을 선택하는 방식을 변경할 수 있습니다 datagridview 열을 자동으로 정렬해야하는 경우 일부 체크 박스 등을 만드십시오. 가 용해되었습니다.

1
private void exportDgvPDF(DataGridView dgvLoadAll, string filename) 
{ 

     BaseFont bf = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250, BaseFont.EMBEDDED); 

     iTextSharp.text.Font text = new iTextSharp.text.Font(bf, 11, iTextSharp.text.Font.NORMAL); 

     Document doc = new Document(PageSize.A2.Rotate(), 1, 1, 1, 1); 
     PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(filename, FileMode.Create)); 
     doc.Open(); 

     // I need to remove 21 columns since I have lots invisible "useless" columns .. will work on that later 
     PdfPTable pdftable = new PdfPTable(dgvLoadAll.ColumnCount - 21); 

     for (int j = 0; j < dgvLoadAll.Columns.Count - 21; j++) 
     { 
      PdfPCell cell = new PdfPCell(new Phrase(dgvLoadAll.Columns[j].HeaderText, text)); 
      cell.BackgroundColor = BaseColor.LIGHT_GRAY; 
      pdftable.AddCell(cell); 
     } 


     pdftable.HeaderRows = 0; 

    // i add foreach i hope this will help you 
     foreach (DataGridViewRow row in dataGridView1.SelectedRows) 
     { 
      for (int k = 0; k < dataGridView1.Columns.Count - 21; k++) 
      { 
       if (dgvLoadAll[k, i].Value != null) 
       { 
       pdftable.AddCell(new Phrase(row.Cells[k].Value.ToString(), text)); 
       } 
      } 

     } 


     doc.Add(pdftable); 
     doc.Close(); 


     } 
관련 문제