【问题标题】:Export selected rows AND columns datagridview导出选定的行和列 datagridview
【发布时间】:2015-02-28 23:01:45
【问题描述】:

我有一个 datagridview,我只需要使用 itextsharp 将选定的行和列导出为 pdf。我能够导出整个datagridview,也只能导出选定的行。

问题 1. 行以相反的顺序导出,而不是我检查它们的方式。 (例如,我检查行 ID 1、5、8,在 pdf 中是 8、5、1)

我不想更改 SelectionMode,因为现在我使用 FullRowSelect 将值加载到文本框并导出选定的行。我在这里找到了一个可能的答案:Get selected Row/Columns Count without Setting Selection Mode 但我无法使用它..

问题 2. 我需要用户选择要导出的行和列。

这是我导出 dgv 的代码:

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(); 
    }

【问题讨论】:

    标签: c# mysql 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(); 
    
    
            }
    

    【讨论】:

      【解决方案2】:

      我想通了。这是我使用 itextsharp 将选定的行和列导出为 pdf 的完整解决方案。

      要选择要导出的列,我使用 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 列进行自动排序,请制作一些复选框等。 解决了。​​

      【讨论】:

        猜你喜欢
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 2013-07-04
        • 1970-01-01
        相关资源
        最近更新 更多