[英]Export selected rows AND columns datagridview
我有一個datagridview,我只需要使用itextsharp將選定的行和列導出到pdf。 我能夠導出整個datagridview,也只能導出選定的行。
問題1.行以相反的順序導出,而不是我如何檢查它們。 (例如,我檢查ID為1、5、8的行,而在pdf中為8、5、1)
我不想更改SelectionMode ,因為現在我使用FullRowSelect將值加載到文本框並導出選定的行。 我在這里找到了可能的答案:在不設置選擇模式的情況下獲取選定的行數/列數,但是我無法使用它。
問題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();
}
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();
}
我想到了。 這是我使用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;
}
}
類似,我創建一個列表行選擇。
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列進行自動排序,請選中一些復選框。 解決了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.