2016-05-23 8 views
0

私はWPF C#で新しいです。WPF C#Treeview Delete&Focuse Node

"HierarchicalDataTemplate"でツリービューを使用しました。 最初にソースからデータを読み込み、ObservableCollection()のシンプルリストに入れてから、シンプルな再帰メソッドによるツリービューを塗りつぶします。 これは完璧に機能しています。

また、私は検索のための単純な再帰的方法と私のツリービューのトラバースを持っています。

残念ながら、私は選択したノードとフォーカスを検索ノードを削除できません。

また、選択されたノードを削除するために、完全ツリービューノードを「MyTreeview.Items.Clear()」で削除し、さらにツリービューを作成します。

「MyTreeview.Items.Clear()」を使用したとき、「MyTreeview_SelectedItemChanged」がトリガーされた理由を教えてください。どうすれば止めることができますか?

I検索し、読んで、多くのドキュメント、Q &を検索してください。このサイトのコードと他の解決策は正しく動作しません。また、「Windowsフォーム」で作業することもできます。

ご協力いただきありがとうございます。

これは私のコードです:

1)XAMLコード:

<TreeView Name="tv_Organization" Height="497" HorizontalAlignment="Left" Margin="9,9,0,0" VerticalAlignment="Top" Width="378" 
        ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" 
        Loaded="tv_Organization_Loaded" Background="White" SelectedItemChanged="tv_Organization_SelectedItemChanged"> 

     <TreeView.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Add New Node" Click="Organization_Add_TV_Node"/> 
       <MenuItem Header="Edit Node" Click="Organization_Edit_TV_Node"/> 
       <MenuItem Header="Delete Node" Click="Organization_Delete_TV_Node"/> 
      </ContextMenu> 
     </TreeView.ContextMenu> 

     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding NodeItem}"> 
        <TextBlock Text="{Binding NodeTitle}" Padding="3,0,3,0" Margin="5,0,0,0"/> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 

    </TreeView> 

2)コードの後ろ:

public class class_Organization 
    { 
     public class_Organization() 
     { 
      this.NodeItem = new ObservableCollection<class_Organization>(); 
     } 
     public int ID { get; set; } 
     public int Parent_ID { get; set; } 
     public long NodeCode { get; set; } 
     public string NodeTitle { get; set; } 
     public bool IsEnable { get; set; } 
     public bool IsLock { get; set; } 
     public bool IsDelete { get; set; } 
     public bool IsSystem { get; set; } 

     public ObservableCollection<class_Organization> NodeItem { get; set; } 
    } 

    private void tv_Organization_Loaded(object sender, RoutedEventArgs e) 
    { 
     using (DC DB = new DC()) 
     { 
      lst_OrganizationTree = (from t in DB.OrganizeTrees 
            orderby t.NodeCode 
            orderby t.Parent_ID 
            select new class_Organization() 
            { 
             ID = t.ID, 
             Parent_ID = t.Parent_ID, 
             NodeCode = t.NodeCode, 
             NodeTitle = t.NodeTitle, 
             IsEnable = t.IsEnable, 
             IsLock = t.IsLock, 
             IsDelete = t.IsDelete, 
             IsSystem = t.IsSystem 
            }).ToList(); 


      tv_Root = new class_Organization() 
      { 
       ID = lst_OrganizationTree[0].ID, 
       Parent_ID = lst_OrganizationTree[0].Parent_ID, 
       NodeCode = lst_OrganizationTree[0].NodeCode, 
       NodeTitle = lst_OrganizationTree[0].NodeTitle, 
       IsEnable = lst_OrganizationTree[0].IsEnable, 
       IsLock = lst_OrganizationTree[0].IsLock, 
       IsDelete = lst_OrganizationTree[0].IsDelete, 
       IsSystem = lst_OrganizationTree[0].IsSystem 
      }; 

      tv_Organization.Items.Add(tv_Root); 
      Recursive_Add_Node(tv_Root); 
     } 
    } 

    private static void Recursive_Add_Node(class_Organization _node) 
    { 
     foreach (var item in lst_OrganizationTree) 
     { 
      if (_node.ID == item.Parent_ID) 
      { 
       class_Organization Childe_Node = new class_Organization() 
       { 
        ID = item.ID, 
        Parent_ID = item.Parent_ID, 
        NodeCode = item.NodeCode, 
        NodeTitle = item.NodeTitle, 
        IsEnable = item.IsEnable, 
        IsLock = item.IsLock, 
        IsDelete = item.IsDelete, 
        IsSystem = item.IsSystem 
       }; 

       _node.NodeItem.Add(Childe_Node); 
       Recursive_Add_Node(Childe_Node); 
      } 
     } 
    } 

    private void tv_Organization_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     UserRowSelect = (class_Organization)tv_Organization.SelectedItem; 
     if (UserRowSelect != null) 
     { 
      Node_ID = UserRowSelect.ID; 
     } 
    } 

    private void Organization_Add_TV_Node(object sender, RoutedEventArgs e) 
    { 

     // Some of Code for Add new Node to Treeview 
    } 

    private void Organization_Edit_TV_Node(object sender, RoutedEventArgs e) 
    { 

     // Some of Code for Edit Last Nodes 
    } 

    private void Organization_Delete_TV_Node(object sender, RoutedEventArgs e) 
    { 
     // Some of Code for Delete Last Node 

     // I Can't Find or Cast Parent Node as Treeview Node !!!!! 
    } 

    private void btn_Accept(object sender, RoutedEventArgs e) 
    { 
     using (DC DB = new DC()) 
     { 

      try 
      { 
       var Q = DB.OrganizeTrees.FirstOrDefault(c => c.Parent_ID == Node_ID); 
       if (Q == null) 
       { 
        var Q1 = DB.OrganizeTrees.FirstOrDefault(c => c.ID == Node_ID); 
        if (Q1 != null) 
        { 
         Q1.IsDelete = true; 
         DB.SubmitChanges(); 
        } 

        tv_Organization.Items.Clear(); 

        tv_Root = new class_Organization() 
        { 
         ID = lst_OrganizationTree[0].ID, 
         Parent_ID = lst_OrganizationTree[0].Parent_ID, 
         NodeCode = lst_OrganizationTree[0].NodeCode, 
         NodeTitle = lst_OrganizationTree[0].NodeTitle, 
         IsEnable = lst_OrganizationTree[0].IsEnable, 
         IsLock = lst_OrganizationTree[0].IsLock, 
         IsDelete = lst_OrganizationTree[0].IsDelete, 
         IsSystem = lst_OrganizationTree[0].IsSystem 
        }; 

        lst_OrganizationTree.RemoveAll((c) => c.NodeCode == UserRowSelect.NodeCode); 

        tv_Organization.Items.Add(tv_Root); 
        Recursive_Add_Node(tv_Root); 

        tv_Organization.Items.Refresh(); 
       } 
       else 
        MessageBox.Show("Error !"); 

      } 
      catch (Exception) 
      { 
       throw; 
      } 

     } 
    } 


    public static void Traverse_Tree(class_Organization _treeview_root) 
    { 
     foreach (var tn in _treeview_root.NodeItem) 
     { 
      Traverse_Tree(tn); 
      // Use tn Field ..... 
     } 
    } 


    public static class_Organization Search_Node(class_Organization _treeview_root, long _nodeCode) 
    { 
     if (_nodeCode > 0) 
     { 
      foreach (var tn in _treeview_root.NodeItem) 
      { 
       if (tn.NodeCode == _nodeCode) 
        return (class_Organization)tn; 
      } 
     } 
     return null; 
    } 
} 

3)出力:(無料マルチレベルのツリービュー)

+0

ねえ、関連するTreeViewItemを削除するだけです。 ObservableCollectionは自動的に残りの部分を処理します。あなたが持っているTreeViewItemsを検索し、関連するノードを見つけてObservableCollectionから削除します。私はまた実例を持っています。私のために、それは働いています – Ugur

+0

ありがとうUgur。 あなたの提案は非常に素晴らしく、完璧に機能します。 しかし、これは子供の親からの作品です。 私の問題は、TreeviewItemとしてキャスト親ノードにあります。 返信いただきありがとうございます。 – Matin

+0

昨日あなたのコードを共有していないので、あなたが定義したどのクラスでも構わないツリービューアイテムを見ることができませんでした。したがってObservableCollection のリストであると仮定します。あなたのケースではObservableCollection Ugur

答えて

0

選択したWPF TreeViewノードを削除するには

yourTreeView.Items.RemoveAt(x); // x is the index of the selected node. 
+0

あなたの答えをありがとう。 残念ながら、このコードは私のためには機能しません。 Treeview.Contextmenuを呼び出してTreeview Nodeを削除しようとしています。 イベントが発生したとき、あなたのコマンドの前に私は8ノードを持っていて、コマンドを実行した後、私は8ノードも持っていました。 実際には、コマンドは自分のツリービューには影響しません。 返信いただきありがとうございます。 – Matin

+0

本当にね。私はちょうどチェックした。このコードはyourTreeView.Items.RemoveAt(x)を動作させるようです。 // xはインデックスです –

+0

これは私の大きな問題の一つです。 私は検索されたノードに焦点を当てようとしましたが、ノードのインデックスを達成したいと思いましたが、残念ながら私はできませんでした。 ノードのインデックスを取得するためのアドバイスはありますか? 返信いただきありがとうございます。 – Matin