Select DataGridCell from DataGrid

后端 未结 3 1654
逝去的感伤
逝去的感伤 2020-12-17 17:30

I have a DataGrid WPF control and I want to get a specific DataGridCell. I know the row and column indices. How can I do this?

I need the

相关标签:
3条回答
  • 2020-12-17 17:59

    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.
    
    0 讨论(0)
  • 2020-12-17 18:03

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

    0 讨论(0)
  • 2020-12-17 18:04

    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

    0 讨论(0)
提交回复
热议问题