2010-11-22 17 views
1

私はWPF TreeViewで作業しています。ツリーの下に新しいアイテムを追加することはできますが、リストから削除することはできません。私のコードでは、選択したツリーアイテムのインデックスを取得し、それを削除しようとしています。しかし、コードはインデックス "-1"を返しています。これはArgumentOutOfRangeExceptionになります。WPFツリービューの削除操作

これを解決するためにお手伝いください。

<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.Items.IndexOf(treeView1.SelectedItem)) 

を持っています。

あなたはtreeView1.Items内のノードのインデックスを取得しようとしているのであれば、それは-1を返します、それはあなたがコードを変更するnned 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

私はWPFに精通していませんが、WinFormsではエラーが発生します。最初のものは、アイテムの内部的な数値の結果である可能性があります。それはこのようなものです: -0 -1 -2 -0 -0 -1 -1 ...

別のつまずきの石は、IndexOfメソッドが返す-1(あなたが言及したようです)項目が見つからなかった場合。値が-1かどうかをチェックしてから、Treeview.Nodes.Nodesの正しいサブリストに移動し、最後にRemoveAt()をコールする必要があります。

私は、これはあなただけParent.Items.Remove(treeView1.SelectedItem)を使用していないのはなぜ パトリック

0

役立ちましたホープは? TreeView1は、一つのノードのみ「親」、あなたが「親」と呼ばれるノードである追加したノードの残りの部分を持っているので、線より下

+0

こんにちはBotz Parent.Items.Remove(...)は結果をもたらしません。もし私がハードコードをいくつかのポジションは、期待通りに動作します://Parent.Items.RemoveAt(2); – vrbilgi

0

ここで私の価値は2セントです。このコードは私のマシンで動作しています。

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); 
    } 
関連する問題