Search code examples
wpfwpfdatagrid

Get all cells in datagrid


Is there a way to get an iteratable collection of all the cells in a DataGrid regardless of whether they are selected or not


Solution

  • If you mean DataGridCells you could use Vincent Sibals helper functions to iterate over all rows DataGrid.Items and columns DataGrid.Columns.

    public DataGridCell GetCell(int row, int column)
    {
        DataGridRow rowContainer = GetRow(row);
    
        if (rowContainer != null)
        {
            DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
    
            // try to get the cell but it may possibly be virtualized
            DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            if (cell == null)
            {
                // now try to bring into view and retreive the cell
                DataGrid_Standard.ScrollIntoView(rowContainer, DataGrid_Standard.Columns[column]);
                cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            }
            return cell;
        }
        return null;
    }
    
    public DataGridRow GetRow(int index)
    {
        DataGridRow row = (DataGridRow)DataGrid_Standard.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null)
        {
            // may be virtualized, bring into view and try again
            DataGrid_Standard.ScrollIntoView(DataGrid_Standard.Items[index]);
            row = (DataGridRow)DataGrid_Standard.ItemContainerGenerator.ContainerFromIndex(index);
        }
        return row;
    }
    

    Edit

    If grid is your DataGrid you get a list of all DataGridCells like this:

    List<DataGridCell> allCellList = new List<DataGridCell>();
    
    for (int i = 0; i < grid.Items.Count; i++)
    {
        for (int j = 0; j < grid.Columns.Count; j++)
        {
            allCellList.Add(grid.GetCell(i, j));
        }
    }