Как запретить редакторам закрываться при фоновой обработке обновлений узла XtraTreeList?

StackOverflow https://stackoverflow.com/questions/1800420

Вопрос

Я использую DevExpress Элемент управления Xtra TreeList для отображения иерархического набора вопросов и ответов - представьте себе сложную форму опроса, содержащую разделы, подразделы и различные вопросы.

Форма работает в несвязанном режиме, без набора данных или привязки данных.

В качестве части информации, отображаемой для каждого вопроса, некоторый фон получается путем вызова веб-службы в фоновом потоке; результаты этих вызовов веб-службы затем используются для заполнения TreeList с помощью вызовов TreeListNode.SetValue () .

В настоящее время эти вызовы SetValue () приводят к закрытию любых активных редакторов, отбрасывая текущий ввод пользователя - очень недружественный опыт пользователя.

Как я могу гарантировать, что эти изменения не будут затронуты процессом редактирования пользователя?

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

Справочная информация. Типичный экран будет содержать более 500 строк, при этом для каждой строки вызов веб-службы требует около 0,6 с. Принудительное принятие или отмена действий пользователя каждые 0,6 с просто неприемлемо, и принуждение пользователей ждать завершения обработки (> 5 минут), прежде чем они смогут внести какие-либо изменения, также плохо.

Это было полезно?

Решение

Краткий ответ: вы не можете

Изменение значения в TreeList приведет к отмене любого текущего пользовательского редактирования, независимо от того, используется ли Binding или нет.

Официальный ответ от DevExpress:

  

К сожалению, невозможно предотвратить закрытие активного редактора при изменении значений источника данных. Это невозможно сделать, потому что TreeList всегда должен быть синхронизирован с базовыми данными. Эта функциональность реализуется через интерфейс IBindingList обычным способом. В ответ на «изменение» Уведомление treeList должен обновить сам и, как следствие, перезагрузить данные. Это приводит к сбросу активного состояния редактирования.      

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

Другие советы

Ну, один из способов, которым я смог это сделать, - ShowEditor () после небольшой задержки после события, которое выполняет обновление (скажем, 100 миллисекунд). Я получил бы проблему из-за notifypropertyaled обновления, и я бы зацепил FocusedNodeChanged. Например:

FocusedNodeChanged += OnNodeChanged;
private void OnNodeChanged(object s, FocusedNodeChangedEventArgs e)
    {
        _delayer.Start();
    }
private void _delayer_Tick(object sender, EventArgs e)
    {
        ShowEditor();
        _delayer.Stop();
    }

_delayer - это класс Timer с тиковым событием. Немного грубо, но это делает свое дело.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top