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).