2010-11-22 31 views
1

WPF TreeView s üzerinde çalışıyorum. Yeni Öğeleri ağacın altına ekleyebiliyorum ancak bunları listeden silemiyorum. Kodumda, seçilen ağaç öğesinin dizinini almaya çalışıyorum ve onu kaldırmaya çalışıyorum. Ancak kod, "-1" dizinine dönüyor. Bu, ArgumentOutOfRangeException ile sonuçlanır.WPF Treeview silme işlemi

Lütfen bunu düzeltmek için yardım edin.

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

cevap

1

sorunu

treeView1.Items.IndexOf(treeView1.SelectedItem)) 

yaşıyor. Eğer treeView1.Items bir düğüm için bir dizin almaya çalışırken eğer

yüzden dönecektir -1 o dönecektir kendisi için 'Veli' adlı düğüm hariç 0.

böylece kodunu değiştirmek nned Aşağıdaki gibi bir düğümü kaldırmak için.

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'ye aşina değilim, ancak WinForms'ta yaklaşımınız hatalara neden olacaktır. Bunlardan ilki, maddelerin içsel sayımının bir sonucu olabilir. Bu gibi: -0 -1 -2 -0 -0 -1 -1 ...

başka güçlük taş IndexOf döndüren -1 (eğer belirtildiği gibi olduğu) öğe bulunamadıysa. Önce değerin -1 olup olmadığını kontrol etmelisiniz, sonra Treeview.Nodes.Nodes ... 'daki doğru Alt Listeye gidin ve sonunda RemoveAt() öğesini çağırın.

Bu Patrick

0

Neden sadece Parent.Items.Remove(treeView1.SelectedItem) kullanmayan yardımcı oldu Umut? TreeView1 tek düğüm 'Veli', sen 'Veli' adlı düğümünde olduğunu eklemiş düğümün dinlenme sahip olduğundan sınırının altında

+0

Merhaba Botz Parent.Items.Remove (...) hiçbir sonuçla sonuçlanmadı. Eğer sabit bir kod varsa, onun çalışmasını beklendiği gibi çalışır: //Parent.Items.RemoveAt(2); – vrbilgi

0

İşte iki sent değerinde. Bu kod makinemde çalışıyor.

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); 
    } 
İlgili konular