C# - DataGridView和SelectedCells - 查找选定单元格的行索引

5
什么是最干净的方式询问DataGridView返回“具有选定单元格的行的索引”? 这不同于DataGridView.SelectedRows。 我不允许行或列选择。 因此,用户必须选择单元格块。 我只需要找出哪些行中有选定的单元格。
是否有一些聪明的lambda表达式我应该使用?你会怎么做?
如果这有所帮助: 在我编写的代码中,我已经继承了DataGridView,并且我在自己的自定义类DataGridViewExt中。

我觉得在LINQ语法中应该有一种类似于SELECT DISTINCT的操作。 - BuddyJoe
应该做还是可能做? - Jay Riggs
应该考虑到未来一年内其他人会维护这个代码库……如果我能用一行话描述意图,而不是三到五行,那对这个项目来说会更好。 - BuddyJoe
2个回答

10

LINQ解决方案:

var rowIndexes = dgv.SelectedCells.Cast<DataGridViewCell>()
                                  .Select(cell => cell.RowIndex)
                                  .Distinct();

编辑:

你只是漏掉了类型转换。它是必需的,因为 DataGridViewSelectedCellCollection 没有实现泛型 IEnumerable<DataGridViewCell>,只实现了非泛型的 IEnumerable,所以当你枚举这些值时,它们的类型是 Object。通过类型转换,会得到如下结果:

int[] rowIndexes = (from sc in this.SelectedCells.Cast<DataGridViewCell>() 
                    select sc.RowIndex).Distinct().ToArray();

太棒了!加一并回答。只是好奇,另一种语法会是什么样子?我在哪里被绊倒了:int[] rowIndexes = (from sc in this.SelectedCells select sc.RowIndex).Distinct().ToArray(); 你能把它加到答案里吗? - BuddyJoe
啊,好的。需要读一两篇关于LINQ和.Cast<>()的文章。谢谢。 - BuddyJoe
获取到这个错误:无法将类型为 'System.Windows.Controls.DataGridCellInfo' 的对象强制转换为类型 'System.Windows.Forms.DataGridViewCell'。我使用的是 DataGrid 而不是 DataGridView,正在做 WPF 应用程序而不是 Windows Forms 应用程序。你可以帮助我吗?:( - Ms. Nobody
@goodfriend:抱歉,这只是一个WinForms解决方案,我对WPF不够熟悉,无法在那个技术上知道答案。 - Meta-Knight
@Meta-Knight 没关系,我自己找到了 :D - Ms. Nobody

1
IEnumerable<int> indexes = 
 (from c in dataGridView1.SelectedCells.Cast<DataGridViewCell>()
  select c.RowIndex).Distinct();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接