Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用所有节点和子节点筛选树视图_C#_Winforms_Treeview - Fatal编程技术网

C# 使用所有节点和子节点筛选树视图

C# 使用所有节点和子节点筛选树视图,c#,winforms,treeview,C#,Winforms,Treeview,我有一个父节点,它有一个子节点,这个子节点有另一个子节点,等等。。它们都在一个TreeView 因此,我创建了一个全局变量,将所有节点保存为: private TreeNodeCollection ProjectTreeView { get; set; } 然后我将树节点的数据设置到全局变量中: ProjectTreeView = this.tvProjectList.Nodes[0].Nodes; 当我点击一个按钮时,我想过滤我的树状视图,所以首先我清除树状视图,然后我迭代集合,只显示符合

我有一个父节点,它有一个子节点,这个子节点有另一个子节点,等等。。它们都在一个
TreeView

因此,我创建了一个全局变量,将所有节点保存为:

private TreeNodeCollection ProjectTreeView { get; set; }
然后我将树节点的数据设置到全局变量中:

ProjectTreeView = this.tvProjectList.Nodes[0].Nodes;
当我点击一个按钮时,我想过滤我的树状视图,所以首先我清除树状视图,然后我迭代集合,只显示符合我条件的节点:

private void rdoisuited\u单击(对象发送方,事件参数e)
{
//阻止重新绘制树,直到加载所有对象
这个.tvProjectList.BeginUpdate();
这个.tvProjectList.Nodes.Clear();
foreach(ProjectTreeView中的TreeNode projectNode)
{
if(bool.Parse(projectNode.Tag.ToString().Split(“|”)[8])==true)
{
添加((TreeNode)projectNode.Clone());
}
}
//在添加所有对象后启用重绘树
这个.tvProjectList.EndUpdate();
}

问题是它只克隆第一个节点,而不克隆子节点。如何克隆包含所有子节点的节点?

执行相反操作要容易得多。您可以遍历所有节点,以保留过滤后的节点并删除其余节点。首先,为0级节点创建备份

public分部类YourForm:Form
{
公共表格
{
初始化组件();
//...
BackUpTree();
}
private List ProjectTreeView=新建列表();
私有void BackUpTree()
{
如果(ProjectTreeView.Count==0)
foreach(tvProjectList.Nodes中的TreeNode tn)
ProjectTreeView.Add(tn.Clone()作为TreeNode);
}
创建重置原始树的方法:

private void ResetTree(bool expandAll=false)
{
tvProjectList.BeginUpdate();
tvProjectList.Nodes.Clear();
foreach(项目树视图中的变量tn)
添加(tn.Clone()作为树节点);
if(expandAll)tvProjectList.expandAll();
tvProjectList.EndUpdate();
}
用于获取所有节点的迭代器函数:

private IEnumerable GetAllNodes(TreeNodeCollection节点)
{
foreach(节点中的树节点)
{
收益率;
foreach(GetAllNodes(tn.Nodes)中的树节点子节点)
退换子女;
}
}
…以及执行过滤部分的方法:

private void FilterTree(bool expandAll=false)
{

ResetTree();//您需要递归克隆每个节点。
clone
方法只创建一个浅层副本。您是否尝试过不创建克隆?所有子节点都已附加到
projectNode
,如果将其添加到树中,则应跟随其父节点。