我有一个TreeView
,其中包含一些TreeNode
,如下所示:
我的想法是使用textBox1
作为搜索引擎,以仅显示包含textBox1
文本的TreeNode。
我已经有一个可以解析不同节点并查看textBox1
中包含的文本是否包含在每个节点中的函数:
private void textBox1_TextChanged(object sender, EventArgs e)
{
foreach (var node in Collect(treeView1.Nodes))
{
if (node.Text.ToLower().Contains(textBox1.Text.ToLower()))
{
//I want to show those nodes
Debug.Write("Contained : ");
Debug.WriteLine(node.Text);
}
else
{
//I want to hide those nodes
Debug.Write("Not contained : ");
Debug.WriteLine(node.Text);
}
}
}
由于TreeNode的属性isVisible
只是一个吸气剂,如何隐藏不包含搜索文本的TreeNode? p>
答案 0 :(得分:0)
根据文档,无法隐藏treenode。但是,您可以删除并重新添加该节点。 您可以使用以下方法进行此操作:
public class RootNode : TreeNode
{
public List<ChildNode> ChildNodes { get; set; }
public RootNode()
{
ChildNodes = new List<ChildNode>();
}
public void PopulateChildren()
{
this.Nodes.Clear();
var visibleNodes =
ChildNodes
.Where(x => x.Visible)
.ToArray();
this.Nodes.AddRange(visibleNodes);
}
//you would use this instead of (Nodes.Add)
public void AddNode(ChildNode node)
{
if (!ChildNodes.Contains(node))
{
node.ParentNode = this;
ChildNodes.Add(node);
PopulateChildren();
}
}
//you would use this instead of (Nodes.Remove)
public void RemoveNode(ChildNode node)
{
if (ChildNodes.Contains(node))
{
node.ParentNode = null;
ChildNodes.Remove(node);
PopulateChildren();
}
}
}
public class ChildNode : TreeNode
{
public RootNode ParentNode { get; set; }
private bool visible;
public bool Visible { get { return visible; } set { visible = value;OnVisibleChanged(): } }
private void OnVisibleChanged()
{
if (ParentNode != null)
{
ParentNode.PopulateChildren();
}
}
}