Выделите отредактированные ячейки WPF DataGrid - PullRequest
0 голосов
/ 20 сентября 2018

В настоящее время я работаю над приложением, отображающим данные, которые я запрашиваю из базы данных в DataGrid.

Поскольку столбцы таблицы не известны заранее, я не смог реализовать DataGrid какObservableCollection объектов, и DataGrid, следовательно, привязывается к DataTable:

MyDataGrid.ItemsSource = _myDataTable.DefaultView;

Пользователи должны иметь возможность редактировать данные непосредственно в DataGrid, а отредактированные ячейки должны быть выделены.

Вна данный момент единственный прогресс, который мне удалось сделать в этом вопросе, - это использование события CellEditEnding для изменения цвета ячейки:

private void MyDataGrid_OnCellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    if (e.EditAction == DataGridEditAction.Commit)
    {
        DataGridCell gridCell = null;
        if (sender is DataGrid dg)
        {
            gridCell = GetCell(dg.CurrentCell);
        }

        if (gridCell != null)
            gridCell.Foreground = Brushes.Red;

    }
}

public DataGridCell GetCell(DataGridCellInfo dataGridCellInfo)
{
    if (!dataGridCellInfo.IsValid)
    {
        return null;
    }

    var cellContent = dataGridCellInfo.Column.GetCellContent(dataGridCellInfo.Item);
    return (DataGridCell) cellContent?.Parent;
}

Этот подход хорошо работает, если пользователь редактирует ячейку с помощьюдважды щелкните по нему, изменив значение и нажав клавишу ввода, чтобы зафиксировать изменения.

Однако произойдет сбой, если пользователь отредактирует ячейку и завершит редактирование, щелкнув новую строку.В этом случае новая ячейка будет окрашена, а не отредактирована, что имеет смысл, так как dg.CurrentCell оценивает новую выбранную ячейку.

Возможные причины приводят к цвету отредактированной ячейки, а не новой выделенной ячейки.?

Знаете ли вы о лучшем подходе для выделения отредактированных ячеек из DataGrid, связанного с DataTable?

1 Ответ

0 голосов
/ 25 сентября 2018

Как вы сказали, использование CurrentCell не будет работать, потому что оно меняется при выборе другой ячейки.Событие OnCellEditEnding предоставляет отредактированный элемент в аргументах события, но вам нужно получить DataGridCell, в котором он содержится, для изменения свойств ячейки.Я тоже хотел бы, чтобы это было просто предоставлено, но вам нужно пройтись по визуальному дереву, чтобы получить его:

private void MyDataGrid_OnCellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    if (e.EditAction == DataGridEditAction.Commit)
    {
            DependencyObject depObj = e.EditingElement;
            while (depObj != null && !(depObj is DataGridCell)) {
                depObj = VisualTreeHelper.GetParent (depObj);
            }

            if (depObj != null) {
                DataGridCell gridCell = (DataGridCell) depObj;
                gridCell.Foreground = Brushes.Red;
            }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...