WPF C# Treeview Delete & Focuse узел

Я новичок в WPF c#.

Я использовал Treeview с «HierarchicalDataTemplate».
Сначала прочитайте данные из источника и поместите в простой список «ObservableCollection ()», а затем заполните Treeview простым рекурсивным методом .
Это сработало идеально.

Кроме того, у меня есть простой рекурсивный метод для поиска и прохождения моего Treeview .

Но, к сожалению, я не могу удалить выбранный узел и фокус искал узел .

Также для удаления выбранного узла я волей-неволей удаляю полный узел Treeview с помощью «MyTreeview.Товары.Очистить()» и сделать Treeview дальше.

почему, когда я использовал » MyTreeview.Товары.Clear ()», «MyTreeview_SelectedItemChanged» trigged ? И как я могу это остановить ?

Я искал , читал и тестировал многие документы , вопросы и ответы и коды на этом сайте и другие, но предлагаемое решение не работает правильно или, возможно, работает в «Windows Form».

Заранее спасибо за любую помощь.

Это мой код :

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) Выход : (свободное мулти ровное Treeview)

1 ответ

  1. Удаление выбранного узла WPF TreeView:

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