2009-04-28 43 views
7

這是一個System.Windows.Forms.TreeView,而不是WPF或Web TreeView。在.NET中延遲加載TreeView

我必須失去了一些東西,因爲我無法相信這是困難的。

我有我的窗體上一個TreeView。加載所有數據以填充TreeView非常緩慢,因此我只想加載頂級節點,然後在用戶擴展節點時填充子節點。問題是,如果一個節點沒有任何子節點,它不會在節點旁邊顯示+符號,這意味着它不能被擴展,這意味着我不能捕獲一個Expanding事件來加載子節點。

幾年前,當我使用PowerBuilder時,您將HasChildren(或類似)屬性設置爲true,以基本上對控件進行「撒謊」並強制顯示+,然後您可以捕獲展開事件。當沒有子節點時,我無法弄清楚如何強制+出現在節點上。

我已經試過的方法,我的虛擬節點添加到每個節點,然後擴大檢查,如果虛擬節點存在,並刪除然後將其加載的孩子,但對於那些不值得進入這裏各種原因該解決方案在我的情況下不可行。

我GOOGLE爲C#,樹視圖,延遲,延遲,負載,力,擴展各種組合,而逃避我現在沒有運氣一些其他條款。

P.S.我在SourceForge上找到了TreeViewAdv項目,但是如果我可以避免的話,我寧願不將新組件引入到我們的環境中。

+1

我一直使用虛擬節點方法;它一般工作得很好。你能告訴我們更多關於爲什麼它不適合你嗎? – Charlie 2009-04-29 02:00:19

回答

4

負載,當一個節點被展開的前2個水平在啓動時和負載2個水平下降。

0

一個可能的解決方案是保持領先的樹狀一步:

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)); 
    } 
} 
0

我也想知道如何得到+旁邊沒有孩子的節點上顯示,但我從來沒有發現一個好辦法。我的解決方案是像這樣處理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 
2

我同意克里斯,我不得不做這個不同的事情。加載頂部節點,然後捕獲單擊事件,確保單擊位於選定節點上,然後填充節點,然後最後展開它。

如果它需要有加,然後加載頂級節點和它拖放一個虛擬節點。確保捕獲點擊或展開事件,清除節點,然後重新填充它。

+2

我第二個虛擬節點的想法。我自己使用它,並將Tag屬性設置爲特定值,以區分「加載...」虛擬節點和其他虛擬節點。在BeforeExpand中,我檢查是否存在虛擬節點並替換內容。這對我來說很有用。 – 2009-04-29 01:54:20

0

您是否試過在BeginUpdate()EndUpdate()調用中附加節點添加項?這會禁用任何繪畫,因此可以將大量節點添加到TreeView中,而不會產生明顯的延遲。

MSDN: TreeView.BeginUpdate Method

+0

我認爲OP意味着加載數據本身(例如從數據庫)緩慢,而不是添加樹節點,所以他們希望按需加載數據(當用戶擴展每個樹節點時)。 – Lucas 2009-04-29 15:13:36

0

您可能需要使用TreeViewAdv(sourceforge上)更好的運氣。