このコードは完全に書き直す必要があると思います。私はあなたの意図について次のことを想定しています、上記の議論で確認されたようなものです。
次のような2つの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;
}
}
このコードは、.NET3.5を対象とするVS2010でテストされています。
コメントを修正および拡張するために編集されました。