Изменения ячеек в SpreadsheetGear WorkbookView не сохраняются

Что не так:

Когда я редактирую ячейку в SpreadsheetGear WorkbookView и инициирую событие CellEndEdit, нажимая Enter, Tab или любую из клавиш со стрелками, только что введенное значение стирается.

Контекст:

  • Кажется, что при редактировании ячейки в WorkbookView поверх WorkbookView добавляется элемент управления, который ведет себя как TextEdit, что позволяет вам вводить данные. Когда происходит событие CellEndEdit, стек вызовов указывает, что WorkbookView вызывает ControlCollection.Remove (...).
  • Это, в свою очередь, заставляет Форму фокусироваться на другом элементе управления на странице. Рассматриваемая страница содержит некоторые элементы управления TextEdit над WorkbookView, которые унаследованы от базовой страницы. Первый TextEdit на короткое время получает фокус.
  • В этих TextEdits устанавливается проверка, которая в конечном итоге инициирует обновление модели. Это стирает то, что находится в WorkbookView, потому что все это происходит до того, как изменение представления будет передано в модель.

Вопросы:

Есть ли способ, чтобы другие элементы управления не получили фокус, прежде чем мои обработчики событий WorkbookViews смогут отправить изменения представления в модель? Или есть другой способ справиться с этим лучше?

Пожалуйста, дайте мне знать, если я могу уточнить где-нибудь или объяснить себя лучше, спасибо!

Обновить:

Я создал тестовое приложение с одним DevExpress TextEdit и одним SpreadsheetGear WorkbookView. Если я добавлю textEdit1_Validated и textEdit1_Enter, я получу такое же поведение. Основное внимание уделяется элементу управления TextEdit, который теперь, похоже, связан с обработчиком проверки.

1 ответ

По-видимому, обработчик проверки элемента управления DevExpress TextEdit запрашивает фокус, и это было проблемой с одним из операторов, которые выполнялись во время обновления модели. Свойство представления для данных в SpreadsheetGear WorkbookView было установлено на версию этого свойства модели, и модель может иметь значения по умолчанию или пользовательские значения.

Утверждение читается примерно так:

view.Data = model.IsUserDefined ? model.Data.UserDefined : model.Data.Default

Я изменил утверждение, чтобы прочитать что-то вроде этого:

if (!model.IsUserDefined)
{
    view.Data = model.Data.Default;
}

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

Мне жаль, что это, вероятно, не окажет большой помощи людям в целом, так как это было проблемой с личной реализацией. Но я все еще думаю, что стоит отметить, что если вы связываете серьезное обновление с обработчиком валидации, что-то подобное должно произойти позже в будущем с появлением все большего количества дополнительных операторов обновления.

Другие вопросы по тегам