2010-11-22 477 views
1

我正在WPF TreeView上工作。我可以在树下添加新的项目,但我无法从列表中删除它们。在我的代码中,我试图获取所选树项目的索引并尝试删除它。但代码返回索引“-1”。这导致了ArgumentOutOfRangeExceptionWPF Treeview删除操作

请帮助解决这个问题。

<Window x:Class="MyTreeStructure.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Button Content="ADD" Height="23" HorizontalAlignment="Left" Margin="211,50,0,0" 
       Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
     <TreeView Height="200" HorizontalAlignment="Left" Margin="27,12,0,0" Name="treeView1" 
        VerticalAlignment="Top" Width="120" > 
      <TreeViewItem Name="Parent" Header="My Tree Content"> 
      </TreeViewItem> 
     </TreeView> 
     <TextBox Height="23" HorizontalAlignment="Left" Margin="211,12,0,0" Name="textBox1" 
       VerticalAlignment="Top" Width="120" /> 
     <Button Content="Delete" Height="23" HorizontalAlignment="Left" Margin="211,79,0,0" 
       Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click" /> 
    </Grid> 
</Window> 

namespace MyTreeStructure 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      TreeViewItem temp = new TreeViewItem(); 
      temp.Header = textBox1.Text; 
      Parent.Items.Add(temp); 
     } 

     private void button2_Click(object sender, RoutedEventArgs e) 
     { 
      textBox1.Text = treeView1.SelectedItem.ToString(); 
      Parent.Items.RemoveAt(treeView1.Items.IndexOf(treeView1.SelectedItem));   
      **// Here I am getting exception. What should be the code here ??**    
     } 
    } 
} 

回答

1

以下线路是由于为TreeView1仅仅有一个节点“父”,您添加是在被称为“父”节点的节点的其余问题

treeView1.Items.IndexOf(treeView1.SelectedItem)) 

所以,如果你想了解我在treeView1.Items一个节点索引,将返回-1,除了所谓的“父”的节点,它会返回0

所以你NNED修改代码用于删除节点如下。

private void button2_Click(object sender, RoutedEventArgs e)  
     {  
      textBox1.Text = treeView1.SelectedItem.ToString(); 
      int index = treeView1.Items.IndexOf(treeView1.SelectedItem)); 
      if(index < 0) 
       { 
        index = Parent.Items.IndexOf(treeView1.SelectedItem)); 
       }  

      if(index > 0) 
       { 
        Parent.Items.RemoveAt(index); 
       } 

     }  
0

我不熟悉WPF,但在WinForms中,您的方法会导致错误。第一个可能是项目内部计数的结果。它是这样的: -0 -1 -2 -0 -0 -1 -1 ...

另一个绊脚石是IndexOf返回-1(如你所提到的)如果该项目未找到。您必须先检查值是否为-1,然后导航到Treeview.Nodes.Nodes中的正确子列表,最后调用RemoveAt()。

我希望这是有帮助的 帕特里克

0

你为什么不只是使用Parent.Items.Remove(treeView1.SelectedItem)

+0

嗨Botz Parent.Items.Remove(...)不会导致任何结果。如果我硬编码某个职位的工作如预期的那样://Parent.Items.RemoveAt(2); – vrbilgi 2010-11-22 09:51:02

0

这是我的两美分价值。此代码正在我的机器上运行。

TreeViewItem t; 

    private void button2_Click(object sender, RoutedEventArgs e) 
    { 
     // Delete the node 
     Parent.Items.RemoveAt(Parent.Items.IndexOf(t));   
    } 

    private void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     // Get the selected node 
     t = (TreeViewItem)(((TreeView)e.Source).SelectedItem); 
    }