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 はそれ自体を更新し、その結果、データを再ロードする必要があります。これにより、アクティブな編集状態がリセットされます。

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

于 2009-11-30T01:50:39.487 に答える
0

私がそれを達成するために達成した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イベントを伴うTimerクラスです。少し粗雑ですが、それでうまくいきます。

于 2012-09-27T20:59:08.993 に答える