1

ツリーコントロールにデータを入力するためにWebサービスにクエリを実行するSilverlightアプリを作成しています。各要素には少なくとも2つのレベルの子があるため、次のようになります。

a
+-b
  +-c
d
+-g
  +-h
e
+-i
  +-j
f
+-k
  +-l

WebサービスAPIは、一度に1レベルの子ノードしか取得できないようになっているため、最初の旅行でa、d、e、fを取得できます。b、g、i、kを取得するには、4回の旅行が必要です。同様に、c、h、j、lを取得するには、さらに4回移動する必要があります。(このサービスでは、実際には1回の旅行ですべてのノードを取得できますが、親子関係は提供されません:-()

私の質問はこれです:ツリービューのすべてのノードを取得する間、ユーザーを前もってしばらく待たせる必要がありますか、それとも上位のいくつかのノードを取得し、他のノードをオンデマンドまたはバックグラウンドで取得する必要がありますタスク?また、ノードは非同期で変更される可能性があるため、すべてのノードを前もって取得する場合は、ツリービューの「更新」ボタンが必要になります。オンデマンドで行う場合は、キャッシュ戦略が必要になります。

ユーザーに最適なのはどれですか?

4

3 に答える 3

1

最初のレベルを前もってロードしてから、必要に応じてオンデマンドでオーバーライドされたバックグラウンドで残りのアイテムをロードするという妥協案。深さ優先(たとえば、a、d、e、fの後にb、c)ではなく、幅優先(たとえば、a、d、e、f、次にb、g、i、k)でノードをロードする場合、ロードをにリダイレクトできます。最近拡張されたノードに焦点を合わせます。

于 2009-04-26T21:21:31.510 に答える
0

個人的には、ユーザーとして、すべてのデータを事前にロードして、アプリケーションのロードが完了したら、もう待つ必要がない(または少なくともごくわずか)と信じられるようにしたいと思います。

しかし、それはあなたのアプリケーション/データのいくつかの特性に依存すると思います:

  • データはどの程度動的ですか?ユーザーがノードを探索する速度よりも頻繁に更新されますか? 含まれている場合は、ユーザーがデータを探索するときにデータを読み取る必要があります。そうしないと、重要な操作を実行する前に、たまに更新して最新のデータを確認するだけで済みます。
  • ユーザーは通常の使用中にどのくらいのデータを探索しますか? ツリー全体を絶えず探索している場合は、ツリー全体をロードすることが重要です。一方、ほとんどのユーザーが通常ツリーのごく一部しか拡張しない場合は、オンデマンドでロードする方がよいので、データのロードに時間を浪費することはありません。
  • これはパフォーマンスにどの程度影響しますか?すべてのデータをロードするのに本当に長い時間がかかりますか? データが多すぎない場合は、すべてを数秒でロードできる可能性があります。その場合、最適化を実装するための作業量はエンドユーザーにとって重要ではなく、その結果、十分な利益が得られません。投資。

ほとんどの場合、これらの質問に対する明確な答えはありませんが、この興味深い問題を攻撃するときに検討することをお勧めします。

于 2009-04-28T06:21:45.523 に答える
0

簡単な答えは、ユーザーができるだけ待たないようにすることです。アプリケーションのロードで10〜20秒待たなければならない場合、彼らはあなたの名前を呪いますが、ツリーノードが拡張するのに0.1〜0.2秒は気づきません。

同様の構造のアプリを本番環境で使用しています。データベース全体を効果的にロードするため、事前にロードできません。これが私の戦略です:

  • ツリーコントロールは、ルートの下に1レベル拡張された状態から始まります。
  • [+]拡張アイコンを表示するために、拡張されていない各ノードにはダミーの子ノードがあります
  • ノードが展開されると、アプリによってトラップされたイベントが発生します。子ノードがダミーノードのみの場合、ダミーは削除され、子はデータベースからロードされます。
  • データの変更は、表示されているノードに自動的に反映されませんが、ツリーのコンテキストメニューには、ノードを更新するために使用できる[更新]項目があります。

更新を非同期で表示することを検討しましたが、ツリーに大量のデータが表示される可能性があり、すべての変更をチェックする場合はDBの負荷に注意するため、これを避ける傾向があります。

アプリはWinFormsで、.NET 2.0を使用してC#で記述されています。

于 2009-04-28T06:33:09.770 に答える