バックグラウンド処理がXtraTreeListノードを更新するときにエディターが閉じないようにする方法

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

質問

DevExpress を使用しています Xtra TreeList コントロールを使用して、質問と回答の階層セットを表示します。セクション、サブセクション、さまざまな質問。

フォームは、データセットもデータバインディングもない非バインドモードで動作しています。

各質問に対して表示される情報の一部として、バックグラウンドスレッドでWebサービスを呼び出すことにより、バックグラウンドが取得されます。これらのWebサービス呼び出しの結果は、 TreeListNode.SetValue()の呼び出しを介してTreeListに入力するために使用されます。

現在、これらの SetValue()の呼び出しにより、アクティブなエディターが閉じられ、ユーザーの現在の入力が破棄されます-非常にユーザーの使いにくいエクスペリエンスです。

ユーザーの編集プロセスがこれらのバックグラウンド更新の影響を受けないようにするにはどうすればよいですか

私が見つけた同様の質問は、DevExpressフォーラムのみにあります。提案は、ユーザーエントリの強制コミットであり、データの損失を回避しますが、それ以外の場合はユーザーエクスペリエンスの低下を修正しません。これらはすべて2007年以降のものなので、状況が変わったことを望んでいます。ユーザー自身のアクティビティの状態を変更せずにノードを更新することは可能ですか?

背景:通常の画面には500行以上あり、各行のwebservice呼び出しは約0.6秒かかります。ユーザーのアクションを0.6秒ごとに強制的にコミットまたはキャンセルすることは受け入れられません。また、変更を加える前にユーザーが処理の完了(5分以上)を待つことも同様に不十分です。

役に立ちましたか?

解決

簡単な答え:できません

TreeListの値を変更すると、現在のユーザー編集がキャンセルされます。バインディングの使用に関係なく、

DevExpressからの公式応答:

  

残念ながら、データソースの値が変更されたときにアクティブなエディターが閉じられるのを防ぐ方法はありません。 TreeListは常に基礎となるデータと同期する必要があるため、達成することはできません。この機能は、通常の方法でIBindingListインターフェイスを介して実装されます。 「変更」に応じてtreeListはそれ自体を更新し、その結果、データをリロードする必要があることを通知します。これにより、アクティブな編集状態がリセットされます。

     

ただし、必要な機能を導入する方法はいくつかあります。たとえば、特定のオブジェクトを直接編集する機能を提供するエディターのセットを含む別のフォームを作成できます。この目標を達成する別の可能な方法は、すべての変更をキャッシュする中間ストレージを作成することです。 TreeListのデータソースとの同期は、ユーザーの要求によって実行する必要があります。

他のヒント

それを実現する方法の1つは、更新を行うイベント(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イベントを持つタイマークラスです。少し粗雑ですが、それはトリックを行います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top