我正在使用DevExpress Xtra TreeList控件来显示一组等级的问题和回答 - 想一个复杂的调查表单,其中包含部分,小节和各种问题。
表单在未绑定模式下工作,没有数据集,也没有任何数据绑定。
作为每个问题显示的信息的一部分,通过在后台线程上调用web服务获得一些背景;然后,这些Web服务调用的结果将通过调用TreeListNode.SetValue()
来填充TreeList。
目前,对SetValue()
的这些调用导致任何活动编辑关闭,丢弃用户当前的输入 - 非常用户不友好体验。
如何确保用户的编辑过程不受这些后台更新的影响?
我发现的唯一类似的问题是在DevExpress论坛上,其中的建议是强制提交用户的条目,这样可以避免数据丢失,但无法解决用户体验不佳问题。由于这些都是从2007年开始的,我希望情况现在已经改变了。是否可以在不改变用户自己活动状态的情况下更新节点?
背景:一个典型的屏幕将有500多行,每行需要大约0.6秒才能返回web服务。根据每0.6秒强行提交或取消用户的操作是不可接受的,并且迫使用户等待处理完成(> 5分钟)才能进行任何更改同样很差。
答案 0 :(得分:3)
简短回答:你不能
更改TreeList中的值将导致任何当前用户编辑被取消,无论是否使用Binding。
DevExpress的官方回应:
不幸的是,当数据源值发生变化时,无法阻止活动编辑器被关闭。无法实现,因为TreeList应始终与底层数据同步。该功能以通常的方式通过IBindingList接口实现。响应“更改”通知,treeList必须刷新自身,并因此重新加载数据。这会导致重置活动编辑状态。
但是,有几种不同的方法可以引入所需的功能。例如,您可以创建一个单独的表单,其中包含一组编辑器,这些编辑器将提供直接编辑特定对象的功能。实现此目标的另一种可能方法是创建一些缓存所有更改的中间存储。与TreeList的数据源的同步应该由用户请求执行。
答案 1 :(得分:0)
我实现它的一种方法是在执行更新的事件(比如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事件的Timer类。有点粗糙但它可以解决问题。