2009-04-28 63 views
7

これは、WPFまたはWeb TreeViewではなくSystem.Windows.Forms.TreeViewです。.NETでのTreeViewの遅延読み込み

これは難しいとは思えないので、私は何かを逃しているに違いない。

私のフォームにはTreeViewがあります。ツリービューにデータを読み込むためにすべてのデータを読み込むのは非常に遅いので、ユーザーがノードを展開するときに、最上位のノードだけをロードして、子ノードを埋めたいとします。問題は、ノードに子がない場合、ノードの横に+記号が表示されないことです。つまり、展開できません。つまり、子をロードするExpandingイベントを取得できません。 。

年前、PowerBuilderを使用していたときに、HasChildren(または類似の)プロパティをtrueに設定してコントロールに本質的に嘘をつけ、強制的に+を表示して、Expandingイベントを取得できました。子ノードがないときに+を強制的にノードに表示する方法を理解できませんでした。

私は各ノードにダミーノードを追加し、ダミーノードが存在するかどうかを確認してそれを削除して子ノードをロードする方法を試しましたが、ここに入る価値がないさまざまな理由でその解決策は私の状況では実行可能ではありません。

私はグーグルで、C#、ツリービュー、遅延、遅延、負荷、強制、拡張、およびいくつかの他の言葉を使用しています。

P.S.私はSourceForgeでTreeViewAdvプロジェクトを見つけましたが、避けることができれば、新しいコンポーネントを私たちの環境に導入したくないのです。私はまた、次の子供のいないノードに表示するために+を取得する方法を不思議に思っていました

private void Form1_Load(object sender, EventArgs e) 
{ 
    // initialise the tree here 
    var nodeSomething = treeView1.Nodes.Add("Something"); 
    nodeSomething.Nodes.Add("Something below something"); 

    treeView1.AfterExpand += AfterExpand; 
} 

private void AfterExpand(object sender, TreeViewEventArgs e) 
{ 
    foreach (TreeNode node in e.Node.Nodes) 
    { 
     // skip if we have already loaded data for this node 
     if (node.Tag != null) 
      continue; 
     node.Tag = new object(); 
     node.Nodes.AddRange(GetDataForThisNode(node)); 
    } 
} 
+1

私は常にダミーノードメソッドを使用しています。それは一般にかなりうまくいく。なぜそれがあなたのために働かないのかについて私たちにもっと教えていただけますか? – Charlie

答えて

4

ノードが展開されたときに起動し、負荷2レベルで第2のレベルをダウンロードします。

0

可能な解決策は、一歩先のTreeViewの滞在することです。私のソリューションはとても似MouseDoubleClickイベントを処理することでした:

Private Sub tvwMain_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles tvwMain.MouseDoubleClick 
    Dim oNode As TreeNode 

    oNode = tvwMain.GetNodeAt(e.X, e.Y) 

    If oNode IsNot Nothing Then 
     If oNode.Nodes.Count = 0 Then 
      'add children here 
     End If 
    End If 
End Sub 
0

が、私は良い方法を発見したことはありません:

2

私はこの異なることを行うために持っていた、クリスに同意します。上位のノードをロードしてから、クリックイベントを取得し、選択したノード上にクリックがあることを確認してからノードを作成し、最後に展開します。

プラスが必要な場合は、トップノードを読み込んでダミーノードをドロップします。クリックイベントまたはエキスパンドイベントをキャプチャし、ノードをクリアしてから再投入してください。

+2

私はダミーノードのアイディアを2番目に指定します。私はそれを使用して、 "Loading ..."ダミーノードを他と区別するためにTagプロパティを特定の値に設定しています。 BeforeExpandでは、ダミーノードの存在をチェックし、内容を置き換えます。それは私のためにうまくいく。 –

0

BeginUpdate()EndUpdate()でノードの追加を囲みましたか?これにより、すべてのペイントが無効になり、TreeViewに大幅な遅延を発生させることなく多数のノードを追加できます。

MSDN: TreeView.BeginUpdate Method

+0

私はOPがデータ自体(DBなど)の読み込みが遅かったと思ったので、ツリーノードを追加しないので、(ユーザーが各ツリーノードを展開したときに)オンデマンドでデータをロードします。 – Lucas

+0

Lucasのコメントは正しいです。 TreeView自体は、十分に速くデータを取り込み、遅いデータを取得しています。 –

0

TreeViewAdv(sourceforge上)を使用する方がよいかもしれません。