Операция удаления дерева просмотра WPF - PullRequest
1 голос
/ 22 ноября 2010

Я работаю над WPF TreeView с. Я могу добавить новые элементы в дерево, но не могу удалить их из списка. В моем коде я пытаюсь получить индекс выбранного элемента дерева и пытаюсь удалить его. Но код возвращает индекс «-1». Это приводит к ArgumentOutOfRangeException.

Пожалуйста, помогите исправить это.

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

Ответы [ 4 ]

1 голос
/ 22 ноября 2010

ниже строки возникла проблема

treeView1.Items.IndexOf(treeView1.SelectedItem))

Поскольку treeview1 имеет только один узел 'Parent', остальная часть добавленного вами узла находится в узле с именем 'Parent'.

Так что, если вы пытаетесь получить индекс для узла в treeView1.Items, он вернет -1, за исключением узла с именем 'Parent', для которого он вернет 0.

чтобы изменить код для удаления узла, как показано ниже.

 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 голосов
/ 22 ноября 2010

Вот мои два цента.Этот код работает на моей машине.

    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);
    }
0 голосов
/ 22 ноября 2010

Почему бы вам просто не использовать Parent.Items.Remove(treeView1.SelectedItem)?

0 голосов
/ 22 ноября 2010

Я не знаком с WPF, но в WinForms ваш подход вызовет ошибки. Первый может быть результатом внутренней нумерации предметов. Это так: 0 -0 -1 -2 1 -0 -0 -1 -1 ...

Еще один камень преткновения заключается в том, что IndexOf возвращает -1 (как вы упомянули), если элемент не был найден. Сначала нужно проверить, равно ли это значение -1, затем перейти к правильному подсписку в Treeview.Nodes.Nodes ... и, наконец, вызвать RemoveAt ().

Надеюсь, это было полезно Patrick

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...