Select DataGridCell from DataGrid Select DataGridCell from DataGrid wpf wpf

Select DataGridCell from DataGrid


You can use code similar to this to select a cell:

var dataGridCellInfo = new DataGridCellInfo(    dataGrid.Items[rowNo], dataGrid.Columns[colNo]);dataGrid.SelectedCells.Clear();dataGrid.SelectedCells.Add(dataGridCellInfo);dataGrid.CurrentCell = dataGridCellInfo;

I can't see a way to update the contents of a specific cell directly, so in order to update the content of a specific cell I would do the following

// gets the data item bound to the row that contains the current cell// and casts to your data type.var item = dataGrid.CurrentItem as MyDataItem;if(item != null){    // update the property on your item associated with column 'n'    item.MyProperty = "new value";}// assuming your data item implements INotifyPropertyChanged the cell will be updated.


You can simply use this extension method-

public static DataGridRow GetSelectedRow(this DataGrid grid){    return (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem);}

and you can get a cell of a DataGrid by an existing row and column id:

public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column){    if (row != null)    {        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);        if (presenter == null)        {            grid.ScrollIntoView(row, grid.Columns[column]);            presenter = GetVisualChild<DataGridCellsPresenter>(row);        }        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);        return cell;    }    return null;}

grid.ScrollIntoView is the key to make this work in case DataGrid is virtualized and required cell is not in view currently.

Check this link for details - Get WPF DataGrid row and cell


Here is the code I used:

    /// <summary>    /// Get the cell of the datagrid.    /// </summary>    /// <param name="dataGrid">The data grid in question</param>    /// <param name="cellInfo">The cell information for a row of that datagrid</param>    /// <param name="cellIndex">The row index of the cell to find. </param>    /// <returns>The cell or null</returns>    private DataGridCell TryToFindGridCell(DataGrid dataGrid, DataGridCellInfo cellInfo, int cellIndex = -1)    {        DataGridRow row;        DataGridCell result = null;        if (dataGrid != null && cellInfo != null)        {            if (cellIndex < 0)            {                row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem(cellInfo.Item);            }            else            {                row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(cellIndex);            }            if (row != null)            {                int columnIndex = dataGrid.Columns.IndexOf(cellInfo.Column);                if (columnIndex > -1)                {                    DataGridCellsPresenter presenter = this.FindVisualChild<DataGridCellsPresenter>(row);                    if (presenter != null)                    {                        result = presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex) as DataGridCell;                    }                    else                    {                        result = null;                    }                }            }        }        return result;    }`

This assumes that the DataGrid has already been loaded (executed its own Loaded handler).