私は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)出力:(無料マルチレベルのツリービュー)
ねえ、関連するTreeViewItemを削除するだけです。 ObservableCollectionは自動的に残りの部分を処理します。あなたが持っているTreeViewItemsを検索し、関連するノードを見つけてObservableCollectionから削除します。私はまた実例を持っています。私のために、それは働いています – Ugur
ありがとうUgur。 あなたの提案は非常に素晴らしく、完璧に機能します。 しかし、これは子供の親からの作品です。 私の問題は、TreeviewItemとしてキャスト親ノードにあります。 返信いただきありがとうございます。 – Matin
昨日あなたのコードを共有していないので、あなたが定義したどのクラスでも構わないツリービューアイテムを見ることができませんでした。したがってObservableCollectionのリストであると仮定します。あなたのケースではObservableCollection –
Ugur