【问题标题】:How to prevent editors from closing when background processing updates XtraTreeList Node?后台处理更新 XtraTreeList 节点时如何防止编辑器关闭?
【发布时间】:2009-11-25 22:38:24
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: c# .net devexpress xtratreelist


    【解决方案1】:

    简短回答:你不能

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

    来自 DevExpress 的官方回应:

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

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

    【讨论】:

    • 我只是添加了一些代码,以便在打开任何编辑器时不更新 XtraTreeList。
    • 是的,我最终也是这样做的。不是最漂亮的 UX 故事,但已经足够好了。
    【解决方案2】:

    我实现的一种方法是在执行更新的事件(例如 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 类。有点粗略,但它可以解决问题。

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多