我认为这段代码需要完全重写。我假设以下关于您的意图,在上面的讨论中得到了证实。
您从两个 DGV 开始,如下所示:
dgvC dgvN
+--------------------------+ +--------------------------+
| C1 C2 C3 C4 C5 C6 | | N1 N2 N3 N4 N5 N6 |
+--------------------------+ +--------------------------+
| v1 v2 v3 v4 v5 v6 | | v20 v21 v22 v23 v24 v25 |
| v7 v8 v9 v10 v11 v12 | | v26 v27 v28 v29 v30 v31 |
| v13 v14 v15 v16 v17 v18 | | v32 v33 v34 v35 v36 v37 |
+--------------------------+ +--------------------------+
如果用户在 dgvC 中选择第 2 行的 C2 和 C3 并运行您的代码,您希望它像这样修改您的表:
dgvC dgvN
+--------------------------+ +--------------------------+
| C1 C2 C3 C4 C5 C6 | | N1 N2 N3 N4 N5 N6 |
+--------------------------+ +--------------------------+
| v1 v2 v3 v4 v5 v6 | | v20 v21 v22 v23 v24 v25 |
| v7 v8 v9 v9 v8 v9 | | v26 v8 v9 v8 v9 v8 |
| v13 v14 v15 v16 v17 v18 | | v32 v33 v34 v35 v36 v37 |
+--------------------------+ +--------------------------+
但是,如果您在第 2 行和第 3 行中矩形选择 C2、C3 和 C4,您希望它看起来像这样:
dgvC dgvN
+--------------------------+ +--------------------------+
| C1 C2 C3 C4 C5 C6 | | N1 N2 N3 N4 N5 N6 |
+--------------------------+ +--------------------------+
| v1 v2 v3 v4 v5 v6 | | v20 v21 v22 v23 v24 v25 |
| v7 v8 v9 v10 v10 v9 | | v26 v8 v10 v9 v8 v10 |
| v13 v14 v15 v16 v16 v15 | | v32 v14 v16 v15 v14 v16 |
+--------------------------+ +--------------------------+
到目前为止我是正确的吗?
如果是这样,我会这样写代码:
int loRow = dgvC.SelectedCells.Cast<DataGridViewCell>().Select(c => c.RowIndex).Min();
int hiRow = dgvC.SelectedCells.Cast<DataGridViewCell>().Select(c => c.RowIndex).Max();
int loCol = dgvC.SelectedCells.Cast<DataGridViewCell>().Select(c => c.ColumnIndex).Min();
int hiCol = dgvC.SelectedCells.Cast<DataGridViewCell>().Select(c => c.ColumnIndex).Max();
for (int i = loRow; i <= hiRow; i++)
{
// start copying from the rightmost selected cell in the current row
int curCopyCol = hiCol;
// now copy to dgvC, starting with hiCol + 1
for (int j = hiCol + 1; j < dgvC.Columns.Count; j++)
{
dgvC.Rows[i].Cells[j].Value = dgvC.Rows[i].Cells[curCopyCol--].Value;
if (curCopyCol < loCol)
curCopyCol = hiCol;
}
// finally, continue copying in dgvN, starting from the second cell
for (int j = 1; j < dgvN.Columns.Count; j++)
{
dgvN.Rows[i].Cells[j].Value = dgvC.Rows[i].Cells[curCopyCol--].Value;
if (curCopyCol < loCol)
curCopyCol = hiCol;
}
}
此代码已在针对 .NET 3.5 的 VS2010 中进行了测试。
编辑以修复和扩展评论。