2016-04-21 82 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[]属性访问节点时,都必须从树中的第一个节点开始,然后迭代转发计数节点,直到达到指定索引。您正在为您访问的每个节点重复进行相同的正向扫描,同时向后退出。这是很多浪费的开销。