首页 > 解决方案 > Datagridview - 将选定的单元格复制到新的 DataTable

问题描述

我需要将 DataGridView 中的数据导出到 Excel 中,但只需要选定的单元格。DataGridView 绑定到 DataTable。我已经看过很多关于如何复制选定行的示例,但找不到如何仅将选定的单元格复制到新的 DataTable 中。这是我迄今为止尝试过的:

  //First, copy structure of DataTable into new one
  DataTable dt = ((DataTable)dgv.DataSource).Clone();

  //Then insert data into new datatable
  foreach (DataGridViewCell cell in dgv.SelectedCells)
  {
    //We get Index of column and row from bounded DataTable 
     int col_indx = ((DataTable)dgv.DataSource).Columns.IndexOf(dgv.Columns[cell.ColumnIndex].Name);
     int row_indx = ((DataTable)dgv.DataSource).Rows.IndexOf(((DataRowView)dgv.Rows[cell.RowIndex].DataBoundItem).Row);

  //First check if row already exists
  if (dt.Columns.Contains(dgv.Columns[cell.ColumnIndex].Name))
            {
                DataRow newrow = dt.NewRow();
                newrow[col_indx] = cell.Value;
                dt.Rows.InsertAt(newrow, row_indx);
            }
            else
            {
               dt.Rows[row_indx][cell_indx] = cell.Value;
            }    

  }
   dt.AcceptChanges();

这部分将数据插入新的 DataTable,但在单独的行中如果我从同一行中选择一些单元格。我怎样才能解决这个问题 ?

编辑:

 for (int i = 0; i < dgv.Rows.Count; i++)
 {
     dt.Rows.Add();
     for (int j = 0; j < dgv.ColumnCount; j++)
     {
        if (dgv.Rows[i].Cells[j].Selected == true)
        {
           dt.Rows[i][j] = dgv.Rows[i].Cells[j].Value;
        }
     }
  }
   dt.AcceptChanges();

这是我能做到的最接近的事情。它将选定的数据复制到新的 DataTable 中,但不幸的是它也保留了空行。因此,当我从例如第 3 行中选择 Datagridview 中的单元格时,Excel 中的输出将前 2 行为空。我想避免这种情况,但是如何......换句话说,我在 Datagridview 中选择的内容必须从第 1 行的新 Datatable 开始,依此类推......

标签: c#datagridview

解决方案


您为每一行添加一行。您必须为每个选定的行添加一行。尝试这个

 int k=0;
 bool addRow;
 for (int i = 0; i < dgv.Rows.Count; i++)
 {
     addRow=true;
     for (int j = 0; j < dgv.ColumnCount; j++)
     {
        if (dgv.Rows[i].Cells[j].Selected == true)
        {
            if(addRow){
                dt.Rows.Add();
                addRow=false;
                k++;
            }
            dt.Rows[k-1][j] = dgv.Rows[i].Cells[j].Value;
        }
     }
  }
   dt.AcceptChanges();

推荐阅读