枚举/迭代System.Windows.Forms.DataGrid的行

本文关键字:Forms DataGrid 的行 Windows System 迭代 枚举 | 更新日期: 2023-09-27 18:08:57

我使用System.Windows.Forms.DataGrid而不是DataGridView。我知道它已经过时了,但我正在使用从DataGrid继承的自定义控件,它太复杂了,不需要几天的工作就不能移植到DataGridView。

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

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

失败,出现如下错误:

'DataGrid'不包含'Rows'的定义,也没有扩展方法…

我该如何迭代它呢?

枚举/迭代System.Windows.Forms.DataGrid的行

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

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

如果有隐藏的行和列,事情会变得更复杂。您可以使用索引器迭代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)
{
    //...
}