3 回答
TA贡献1777条经验 获得超10个赞
您为每一行添加一行。您必须为每个选定的行添加一行。试试这个
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();
TA贡献1794条经验 获得超7个赞
问题解决了。但这并不容易。首先,我必须创建一个与有界数据表具有相同结构的新数据表。然后将所有选定的单元格复制到该数据表中。最后,我创建了一个新的 DataTable,其中只有不为空的行,使用来自 Levitikon 的这个答案的 CopyToDataTable方法。这是完整的代码:
//First, copy structure of DataTable into new one
DataTable dt = ((DataTable)dgv.DataSource).Clone();
//Add all selected cells into this 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();
// Then create a new DataTable without blank rows
DataTable final_dt = dt.Rows.Cast<DataRow>()
.Where(row => !row.ItemArray.All(field => field is DBNull ||
string.IsNullOrWhiteSpace(field.ToString()))).CopyToDataTable();
现在,我在 DataGridView 中选择的所有内容都会添加到新的 DataTable 中,一旦我在 Excel 中导出此 DataTable,所有数据都会根据需要从第 0 行开始。如果有人知道更好/更短的解决方案,请告诉我。
TA贡献2019条经验 获得超9个赞
您正在遍历每个选定的单元格,并在指定的row_indx处创建/插入一个新行,而不检查这些单元格是否属于同一行,以及dt是否已经在row_indx处插入了一行。
我建议检查您是否已经在row_indx处插入了一行,如果它已经插入该行并将选定的单元格添加到其中,如果它没有该行则创建一个新行并添加选定的单元格。
- 3 回答
- 0 关注
- 323 浏览
添加回答
举报