1

我正在使用DevExpress Xtra TreeList控件来显示一组分层的问题和响应 - 考虑一个复杂的调查表,其中包含部分、子部分和各种问题。

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

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

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

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

我发现的唯一类似问题是在 DevExpress 论坛上,其中建议是强制提交用户的条目,这样可以避免数据丢失,但不能解决糟糕的用户体验。由于这些都是从 2007 年开始的,我希望现在情况已经改变。是否可以在不改变用户自己活动状态的情况下更新节点?

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

4

2 回答 2

3

简短的回答:你不能

更改 TreeList 中的值将导致任何当前用户编辑被取消,无论是否使用 Binding。

DevExpress 官方回应:

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

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

于 2009-11-30T01:50:39.487 回答
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 是一个带有刻度事件的 Timer 类。有点粗糙,但它的伎俩。

于 2012-09-27T20:59:08.993 回答