2010-11-22 480 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); 
    }