-2

それで、何度も試みた後(そしてプロジェクトのソースアイデアを変更した後)、1つの行が選択された場合にうまく機能するコードを作成しました(つまり、1つの単一行のいくつかのセル)。
ただし、最初と最後の行(つまり、rowIndex 0とnewRow)を除いて、複数の行(セルが選択されている場合)に対して同じことを繰り返したいと思います。物事は複雑になりすぎます。誰か助けてもらえますか?

int r = dgvC.CurrentRow.Index;
var selCells = dgvC.SelectedCells;
var hColumn = (from DataGridViewCell c in selCells;
               orderby c.ColumnIndex descending select c).FirstOrDefault();

List<DataGridViewCell> q = new List<DataGridViewCell> { };
foreach (DataGridViewCell p in dgvC.CurrentRow.Cells)
{
    if (p.ColumnIndex > hColumn.ColumnIndex)
    {
        q.Add(p);
    }
}

foreach (DataGridViewCell v in dgvN.Rows[r].Cells)
{
    if (v.ColumnIndex > 0)
    {
        q.Add(v);
    }
}

List<string> a = new List<string> { };
foreach (DataGridViewCell cell in dgvC.SelectedCells)
{
    a.Add(cell.Value.ToString());
    a.Reverse();
}

List<string> result = (from ignored in Enumerable.Range(0, int.MaxValue)
                       from item in a select item).Take(q.Count).ToList();

for (int i = 0; i < q.Count; i++)
{
    q.ElementAt(i).Value = result.ElementAt(i);
}
4

2 に答える 2

2

このコードは完全に書き直す必要があると思います。私はあなたの意図について次のことを想定しています、上記の議論で確認されたようなものです。

次のような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でテストされています。

コメントを修正および拡張するために編集されました。

于 2012-06-07T20:49:13.813 に答える
0

データグリッドビューの行選択/セル選択イベントにフックして、どの行が選択されているかを追跡してみませんか?このようにして、イベントを発生させた行を調べて、イベントを保持するか、内部コレクションから削除するかを決定できますか?現在のコードのようにリストを作成する代わりに、行オブジェクトの内部コレクション、または選択されてそこから機能する行のインデックスのみを保持できます。

于 2012-06-07T19:23:49.910 に答える