Naourass Derouichi
Naourass Derouichi

Reputation: 793

DataGridView selected rows to DataTable

I'm trying to add only the selected rows of a DataGridView to a DataTable, the code that I'm using always start from the first row even if this one is not selected... Does someone have an idea for how to fix this please?

DataTable dt = new DataTable("Rapport");

// Generating columns to datatable
foreach (DataGridViewColumn column in dataGridView1.Columns)
    dt.Columns.Add(column.Name, typeof(string));

// Adding selected rows of DGV to DataTable
for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
{
    dt.Rows.Add();
    for (int j = 0; j < dataGridView1.Columns.Count; j++)
    {
        dt.Rows[i][j] = dataGridView1[j, i].Value;
    }
}

Upvotes: 5

Views: 42236

Answers (2)

Gopal
Gopal

Reputation: 57

DataTable dt = ((DataTable)dgvQueryResult.DataSource).Clone();
foreach (DataGridViewRow row in dgvQueryResult.SelectedRows)
{
    dt.ImportRow(((DataTable)dgvQueryResult.DataSource).Rows[row.Index]);
}
dt.AcceptChanges();

Upvotes: 2

Habib
Habib

Reputation: 223412

You have to access SelectedRows like

dt.Rows[i][j] = dataGridView1.SelectedRows[i].Cells[j].Value;

Also its better if your DataTable has the same type as of Cell

DataTable dt = new DataTable();
 foreach (DataGridViewColumn column in dataGridView1.Columns)
    dt.Columns.Add(column.Name, column.CellType); //better to have cell type

So your code would be:

DataTable dt = new DataTable();
foreach (DataGridViewColumn column in dataGridView1.Columns)
    dt.Columns.Add(column.Name, column.CellType); //better to have cell type
for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
{
     dt.Rows.Add();
     for (int j = 0; j < dataGridView1.Columns.Count; j++)
     {
         dt.Rows[i][j] = dataGridView1.SelectedRows[i].Cells[j].Value;
                                   //^^^^^^^^^^^
     }
 }

Upvotes: 13

Related Questions