Search code examples
c#wpftreeview

WPF Treeview delete operation


I am working on WPF TreeViews. I am able to add the new Items under tree, but I am not able to delete them from the list. In my code I am trying to get the index of the selected tree item and trying to Remove it. But the code is returning Index "-1". This results in an ArgumentOutOfRangeException.

Please help to fix this.

<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 ??**             
        }
    }
}

Solution

  • below line is having the problem

    treeView1.Items.IndexOf(treeView1.SelectedItem))
    

    Since treeview1 is only having one node 'Parent' , rest of the node which you have added is in the node called 'Parent'.

    So if you trying to get the index for a node in treeView1.Items it will return -1 except for the node called 'Parent' for which it will return 0.

    so you nned to modify the code for removing a node as below.

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