Omid
Omid

Reputation: 823

Getting value of cell in DataGrid in WPF

For WinForms it's:

var value = DataGridView.Rows[0].Cells[0].Value

Is there any way to get it in WPF?

Upvotes: 6

Views: 14509

Answers (2)

Eren Ersönmez
Eren Ersönmez

Reputation: 39085

Generally, you shouldn't need to do that. In WPF, datagrid is meant to be used with data binding, which means there is an underlying collection or object that has the same value as the cell, so you need to access that collection/object directly. If you are needing to access the cell value, you might need to reconsider your design.

Upvotes: 4

dwonisch
dwonisch

Reputation: 5785

I think the best way would be to use the Items property and directly access your data item:

var dataItem = dataGrid.Items[0] as ...;

But You can use this class to get the cell and access the value with the GetValue() method (would be more like your example).

Code taken from here: datagrid get cell index

static class DataGridHelper {
    static public DataGridCell GetCell(DataGrid dg, int row, int column) {
        DataGridRow rowContainer = GetRow(dg, 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
                dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            }
            return cell;
        }
        return null;
    }

    static public DataGridRow GetRow(DataGrid dg, int index) {
        DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null) {
            // may be virtualized, bring into view and try again
            dg.ScrollIntoView(dg.Items[index]);
            row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
        }
        return row;
    }

    static T GetVisualChild<T>(Visual parent) where T : Visual {
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++) {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null) {
                child = GetVisualChild<T>(v);
            }
            if (child != null) {
                break;
            }
        }
        return child;
    }
}

Upvotes: 5

Related Questions