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 關注
- 421 瀏覽
添加回答
舉報