Как заставить сетку передавать значение в источник данных сразу при изменении?

У меня есть XtraGrid DevExpress, который привязан к набору объектов. Я хочу, чтобы изменения попадали в базовый источник данных сразу после изменения. Но поведение DevExpress по умолчанию заключается в том, чтобы помещать новые значения в источник данных только тогда, когда пользователь покидает ячейку. Таким образом, по умолчанию, когда пользователь вводит «Hello world» в ячейку, источник данных получает все предложение за один раз. Но я хочу, чтобы он получал "H", "He", "Hel" и так далее.

Я попытался вызвать PostEditor() в обработчике событий CellValueChanging, но это не помогло. Любые другие идеи?


person Dmitry    schedule 22.03.2012    source источник


Ответы (3)


Редакторы Grid на месте предоставляют событие EditValueChanged, которое происходит, когда конечный пользователь вводит текст в редакторе. или как-то меняет свое значение. Вы можете обработать это событие, чтобы отправить текущее отредактированное значение в источник данных.
Поэтому я рекомендую вам использовать следующий подход:

    //...
    gridView.ShownEditor += gridView_ShownEditor;
    gridView.HiddenEditor += gridView_HiddenEditor;
}
DevExpress.XtraEditors.BaseEdit gridViewActiveEditor;
void gridView_ShownEditor(object sender, EventArgs e) {
    gridViewActiveEditor = gridView.ActiveEditor;
    gridViewActiveEditor.EditValueChanged += ActiveEditor_EditValueChanged;
}
void gridView_HiddenEditor(object sender, EventArgs e) {
    gridViewActiveEditor.EditValueChanged -= ActiveEditor_EditValueChanged;
}
void ActiveEditor_EditValueChanged(object sender, EventArgs e) {
    gridView.PostEditor();
}
person DmitryG    schedule 22.03.2012
comment
Событие HiddenEditor вызывается при закрытии редактора, поэтому gridView.ActiveEditor имеет значение null. Есть ли другое событие, которое можно обработать для удаления обработчика EditValueChanged? - person Yuyo; 24.07.2014
comment
@Yuyo В любом случае вы можете сохранить значение gridView.ActiveEditor в переменной поля в событии ShownEditor, а затем использовать это значение для отказа от подписки (соответственно я обновил свой ответ). - person DmitryG; 28.07.2014

Я думаю, что CellValueChanging — это событие для перехвата, но вместо PostEditor() попробуйте UpdateCurrentRow().

person Brad Rem    schedule 22.03.2012
comment
Спасибо! Не помогло. Такое же поведение - значение попадает в источник данных только тогда, когда я покидаю ячейку. - person Dmitry; 22.03.2012

Этот код в обработчике событий CellValueChanging представления решил проблему:

    private void OnCellValueChanging(object sender, CellValueChangedEventArgs e)
    {
        _gridView.SetFocusedRowCellValue(_gridView.FocusedColumn, e.Value);
    }
person Dmitry    schedule 23.03.2012
comment
Я должен сказать, что это неправильное решение, которое может привести к множеству проблем (например, вы убили проверку редактора, а также потеряли позицию курсора редактора) - person DmitryG; 24.03.2012
comment
Это не работает, если редактор ячеек является текстовым редактором, потому что SetFocusedRowCellValue всегда сбрасывает позицию курсора. - person Adiono; 30.11.2014