C# Foreach DataGridViewRow过程
因此,经过多次尝试(并改变了项目的源代码思想),我编写了一些代码,如果选择了一行(即一行中的一些单元格),这些代码会很好地工作。C# Foreach DataGridViewRow过程,c#,winforms,datagridview,C#,Winforms,Datagridview,因此,经过多次尝试(并改变了项目的源代码思想),我编写了一些代码,如果选择了一行(即一行中的一些单元格),这些代码会很好地工作。 但是,我想对多行(如果选择了任何单元格)重复相同的操作,除了第一行和最后一行(即rowdex0和newRow)。事情变得太复杂了。有人能帮忙吗 int r = dgvC.CurrentRow.Index; var selCells = dgvC.SelectedCells; var hColumn = (from DataGridViewCell c in selCe
但是,我想对多行(如果选择了任何单元格)重复相同的操作,除了第一行和最后一行(即rowdex0和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);
}
int r=dgvC.CurrentRow.Index;
var selCells=dgvC.SelectedCells;
var hColumn=(来自selCells中的DataGridViewCell c;
orderby c.ColumnIndex降序选择c).FirstOrDefault();
列表q=新列表{};
foreach(dgvC.CurrentRow.Cells中的DataGridViewCell p)
{
if(p.ColumnIndex>hColumn.ColumnIndex)
{
q、 加(p);
}
}
foreach(dgvN.Rows[r].Cells中的DataGridViewCell v)
{
如果(v.ColumnIndex>0)
{
q、 添加(v);
}
}
列表a=新列表{};
foreach(dgvC中的DataGridViewCell单元格。SelectedCells)
{
a、 添加(cell.Value.ToString());
a、 反向();
}
列表结果=(从Enumerable.Range(0,int.MaxValue)中忽略)
从选择项中的项)。获取(q.Count).ToList();
对于(int i=0;i
为什么不尝试挂接datagrid视图的“选定行/选定单元格”事件,以跟踪选定的行?这样,您就可以检查引发事件的行,并确定是保留该行还是从内部集合中删除该行?您可以保留行对象的内部集合,或者只保留已选择行的索引,并从中进行操作,而不是像当前代码那样尝试构建列表。我认为此代码需要完全重写。我假设你的意图如下,在上面的讨论中得到了证实
从两个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 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 |
+--------------------------+ +--------------------------+
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;
}
}
如果用户在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 v10 v11 v12 | | v26 v27 v28 v29 v30 v31 |
| v13 v14 v15 v16 v17 v18 | | v32 v33 v34 v35 v36 v37 |
+--------------------------+ +--------------------------+
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 |
+--------------------------+ +--------------------------+
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;
}
}
但是,如果您在第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 v11 v12 | | v26 v27 v28 v29 v30 v31 |
| v13 v14 v15 v16 v17 v18 | | v32 v33 v34 v35 v36 v37 |
+--------------------------+ +--------------------------+
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 |
+--------------------------+ +--------------------------+
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;
}
}
到目前为止我说的对吗
如果是这样,我会这样写代码:
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 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 |
+--------------------------+ +--------------------------+
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;
}
}
int-loRow=dgvC.SelectedCells.Cast().Select(c=>c.RowIndex.Min();
int hiRow=dgvC.SelectedCells.Cast().Select(c=>c.RowIndex.Max();
int loCol=dgvC.SelectedCells.Cast().Select(c=>c.ColumnIndex.Min();
int hiCol=dgvC.SelectedCells.Cast().Select(c=>c.ColumnIndex.Max();
对于(int i=loRow;i否,但按空格分隔部分。从未见过这种约定…我不喜欢它。您是否尝试反转每行中选定单元格中的值?如果选择不是矩形(您可以使用Ctrl+左键单击从选择列表中添加/删除单个单元格),该怎么办?是的,无论我在展示行中做了什么-我都需要依次为对方做。我将以某种方式阻止用户进行不可纠正的选择。我为您处理了那些麻烦的大括号和缩进。我一天中有3分钟多余的时间。但是,我对您的努力投了反对票。我不是匿名的反对票。=)内部收集而不是列表?列表也是内部的,不是吗?作为viewmodel属性的内部列表(或者在本例中,可能是表单)。Dominic,它可以工作。祝贺你的好心情。