【发布时间】:2015-11-29 13:12:40
【问题描述】:
出于某种奇怪的原因,DataGridViewSelectedRowCollection 的填充顺序与DataGridView 中显示的顺序相反。但更令人费解的是,为什么没有一种直接的方法可以颠倒在foreach 循环中使用的顺序。
我希望能够使用像这样简单的语法:
foreach (DataGridViewRow r in dataGridView1.SelectedRows.Reverse())
...当然,这是不支持的。*
所以,目前我正在使用这个怪物:
//reverse the default selection order:
IEnumerable<DataGridViewRow> properlyOrderedSelectedRows
= dataGridView1.SelectedRows.Cast<DataGridViewRow>().ToArray().Reverse();
foreach (DataGridViewRow r in properlyOrderedSelectedRows )
{
MessageBox.Show( r.Cells["ID"].Value.ToString());
}
...这非常丑陋和令人费解。 (我意识到我可以使用反向 For 循环,但我更喜欢 foreach 的可读性。)
我在这里缺少什么?有没有更简单的方法?
*实际上,根据discussion here,我本来希望这个版本可以工作,因为DataGridViewSelectedRowCollection implements IEnumerable;但它没有编译。
【问题讨论】:
-
你能把它们按相反的顺序写出来吗?从数组的末尾循环到开头?避免调用全部反转?
-
@SamPlusPlus:我想使用
foreach循环,如上所述。 -
在您的限制下(老实说,我不太清楚;就我个人而言,我会依赖反向 for 循环)您的方法似乎很好(您可以通过删除正确的OrderedSelectedRows 和在 foreach 循环中添加整个反转)。至少,假设 SelectedRows 总是以完全相反的顺序提供;否则你将不得不依赖 OrderBy by row index。
标签: c# winforms collections datagridview