【问题标题】:Enumerate/iterate the rows of a System.Windows.Forms.DataGrid枚举/迭代 System.Windows.Forms.DataGrid 的行
【发布时间】:2017-02-03 23:42:50
【问题描述】:

我正在使用 System.Windows.Forms.DataGrid 而不是 DataGridView。我知道它已经过时了,但我使用的是a custom control that inherits from DataGrid,而且它太复杂了,无法在没有几天工作的情况下移植到 DataGridView。

我需要遍历行,但它没有 Rows 集合,所以尝试像

DataGrid grid = filterableGrid.EmbeddedDataGrid;
foreach (var row in grid.Rows)
{
    // do stuff
}

失败并出现此错误:

“DataGrid”不包含“Rows”的定义,也没有扩展方法...

那么我该如何迭代呢?

【问题讨论】:

  • 你想对这些行做什么?
  • 计算一列的总和。
  • 要显示DataTableColumn 的值的总和,您可以使用DataTableCompute 方法。您可能会发现这篇文章很有用:Show total Sum of values of a Column of a DataTable
  • @RezaAghaei 再次感谢。
  • 不客气。另请阅读编辑:)

标签: c# .net winforms datagrid


【解决方案1】:

如果您没有隐藏的行或列,您可以使用以下代码对其进行迭代:

for (int row = 0; row < grid.VisibleRowCount; row++)
{
    for (int column = 0; column < grid.VisibleColumnCount; column++)
    {
        var value = grid[row, column];
    }
}

如果有隐藏的行和列,事情就会变得更加复杂。您可以通过这种方式使用indexer 遍历DataGrid 的行和列:

var rowsCount = grid.BindingContext[grid.DataSource, grid.DataMember].Count;
var columnsCount = ((DataGridTableStyle)(grid.GetType().GetField("myGridTable",
    System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
    .GetValue(grid))).GridColumnStyles.Count;

for (int row = 0; row < rowsCount; row++)
{
    for (int column = 0; column < columnsCount; column++)
    {
        var value = grid[row, column];
    }
}

此外,如果您的DataGridDataSourceDataTable,您可以使用:

var table = grid.DataSource as DataTable;
foreach (DataRow row in table.Rows)
{
    //...
}

【讨论】:

  • 但这不会只返回可见行和列吗?
  • @Evk 是的,它需要修复我会发布一个编辑,谢谢 :)
  • @Evk 我编辑了答案并以最可靠的方式使用了rowsCountcolumnsCount。如果您知道更好的选择,请告诉我:)
  • 正弦 DataSource 可能是 List&lt;T&gt; 通过将 DataSource 转换为 DataTable 来提取列数和行数并不是一个好的解决方案。
  • 是的,这个控件设计得很糟糕。重点是问题作者当然会看到编辑。
猜你喜欢
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2013-05-11
相关资源
最近更新 更多