C# 当后台处理更新XtratreList节点时,如何防止编辑器关闭?

C# 当后台处理更新XtratreList节点时,如何防止编辑器关闭?,c#,.net,devexpress,xtratreelist,C#,.net,Devexpress,Xtratreelist,我使用控件来显示一组分层的问题和回答——想象一下一个复杂的调查表单,其中包含部分、小节和各种问题 表单在未绑定模式下工作,没有数据集,也没有任何数据绑定 作为每个问题显示的信息的一部分,通过在后台线程上调用Web服务来获得一些背景信息;这些webservice调用的结果然后通过调用TreeListNode.SetValue()来填充树列表 目前,对SetValue()的这些调用正在导致任何活动编辑器关闭,丢弃用户的当前输入-这是一种非常不友好的用户体验 如何确保用户的编辑过程不受这些背景更新的影

我使用控件来显示一组分层的问题和回答——想象一下一个复杂的调查表单,其中包含部分、小节和各种问题

表单在未绑定模式下工作,没有数据集,也没有任何数据绑定

作为每个问题显示的信息的一部分,通过在后台线程上调用Web服务来获得一些背景信息;这些webservice调用的结果然后通过调用
TreeListNode.SetValue()
来填充树列表

目前,对
SetValue()
的这些调用正在导致任何活动编辑器关闭,丢弃用户的当前输入-这是一种非常不友好的用户体验

如何确保用户的编辑过程不受这些背景更新的影响?

我发现的唯一类似的问题是在DevExpress论坛上,这里的建议是强制提交用户条目,这避免了数据丢失,但对修复糟糕的用户体验没有任何帮助。由于这些都是从2007年开始的,我希望现在情况有所改变。是否可以在不改变用户自身活动状态的情况下更新节点


背景:一个典型的屏幕将有500多行,每行的webservice调用大约需要0.6秒才能返回。每隔0.6秒强制提交或取消用户的操作是不可接受的,强迫用户等待处理完成(>5分钟),然后才能进行任何更改也同样糟糕。

简短回答:你不能

更改树列表中的值将导致取消任何当前用户编辑,无论是否使用绑定

DevExpress的官方回应:

不幸的是,当数据源值发生更改时,无法阻止活动编辑器关闭。这是不可能实现的,因为树列表应该始终与底层数据同步。此功能以通常方式通过IBindingList接口实现。为了响应“更改”通知,树列表必须刷新自身,从而重新加载数据。这将导致活动编辑状态重置

但是,有几种不同的方法来引入所需的功能。例如,您可以创建一个单独的表单,该表单将包含一组编辑器,这些编辑器将提供直接编辑特定对象的功能。实现此目标的另一种可能的方法是创建一些中间存储,以缓存所有更改。应根据用户请求执行与树列表的数据源的同步


我实现这一点的一种方法是,在一个更新事件(比如100毫秒)发生后,在一个小的时间延迟后使用ShowEditor()。我会因为notifypropertychanged更新而遇到问题,我会挂接FocusedNodeChanged。例如:

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

_delayer是一个带有tick事件的计时器类。有点粗糙,但它确实起到了作用。

我只是添加了一些代码,在任何编辑器打开时都不会更新XtraTreeList。是的,我最后也这么做了。不是最漂亮的用户体验故事,但已经足够好了。