2016-04-21 79 views
0

我想選擇的列表數據填充樹數據未在樹視圖正在填充從ListView控件

這裏是我試圖向它

if ListView1.Items[Count].Selected then 
begin 
    Root := ListView1.Items[Count].Caption; 
    for Itr := TreeView1.Items.Count-1 downto 0 do Begin 
    if TreeView1.items[itr].Parent.Text = Root then begin 
     TreeNode := TreeView1.Items[itr].getFirstChild; 
     Treeview1.Items.AddChild(Treenode,ListView1.Items[Count].SubItems[0]); 
     break; 
    end; 
    end; 
end; 

但其創造新的節點,並有一個索引錯誤。

請幫助

+0

你想在第一個地方完成什麼?你的ListView是什麼樣的?當選擇ListView時,你的TreeView應該是什麼樣子?哪一行引發索引錯誤?你爲什麼要按照你的方式掃描TreeView?一般來說,使用'TreeView1.Items []'通常效率非常低,但對於向後迭代而言,後向迭代更爲重要。此外,如果您碰巧在內部循環中達到索引0,則「TreeView1.Items [0] .Parent」將爲零,並且您的代碼將會崩潰,從而無法訪問「Parent.Text」。 –

+0

您最近問了幾個與錯誤處理Treeview迭代有關的問題。我認爲您可能需要重新考慮整個數據存儲方法,以便您的TreeView處理更加清晰。 –

+0

[昨天你說轉移「發生得很好。」](http://stackoverflow.com/q/36725780/33732)使用你的版本控制工具來檢查你現在和之後引入迴歸的位置。 (如果你不使用版本控制工具,那麼你應該從今天開始這樣做,Delphi內置的基本功能可能有助於這種有限的情況,因爲最近的迴歸發生了。) –

回答

2

您還沒有提供關於你的ListView數據的模樣,還是什麼TreeView的是應該樣子就該數據任何細節。但我懷疑代碼或許應該看起來更像這個:

if ListView1.Items[Count].Selected then 
begin 
    Root := ListView1.Items[Count].Caption; 
    for Itr := TreeView1.Items.Count-1 downto 0 do begin 
    TreeNode := TreeView1.Items[itr]; 
    if TreeNode.Text = Root then begin 
     TreeView1.Items.AddChild(TreeNode, ListView1.Items[Count].SubItems[0]); 
     break; 
    end; 
    end; 
end; 

注意,通過一個TreeView 迭代向後是非常低效的。樹本身不是可索引的,所以每次通過索引通過TreeView1.Items[]屬性訪問節點時,都必須從樹中的第一個節點開始,然後迭代轉發計數節點,直到達到指定索引。您正在爲您訪問的每個節點重複進行相同的正向掃描,同時向後退出。這是很多浪費的開銷。