My tree view populated by folders and files. And I have used below code for filtering tree view but it does not return all the files that match string, just it returns one file.
For example letter “f” there is in 3 files but when I search it returns just 1 file.
private TreeNode FindNodeByValue(TreeNodeCollection nodes, string searchstring)
{
// Loop through the tree node collection
foreach (TreeNode node in nodes)
{
// Does the value match the search string?
if (node.Value.ToUpper().Contains (searchstring.ToUpper()))
// Yes it does match - return it
return node;
else
{
// No it does not match - search any child nodes of this node
TreeNode childNode = SearchChildNodes(node, searchstring);
// If the childNode is not null it was a match
if (childNode != null)
// Return the matching node
return childNode;
}
}
// If the matching node is not found return null
return null;
}
/// <summary>
/// This method searches a node's ChildNodes collection to find a matching value
/// with the incoming search string
/// It will iteratively call itself as it drills into each nodes child nodes (if present)
/// </summary>
/// <param name="parentNode">Parent node to search for a match</param>
/// <param name="searchstring">string to be matched with the Nodes Value property</param>
/// <returns>Treenode of the matching node if found. If not found it will be null</returns>
private TreeNode SearchChildNodes(TreeNode parentNode, string searchstring)
{
// Loop through the child nodes of the parentNode passed in
foreach (TreeNode node in parentNode.ChildNodes)
{
// Does the value match the search string?
if (node.Value.ToUpper().Contains(searchstring.ToUpper()))
// Yes it does match - return it
return node;
else
{
// No it does not match - recursively search any child nodes of this node
TreeNode childNode = SearchChildNodes(node, searchstring);
// If the childNode is not null it was a match
if (childNode != null)
// Return the matching node
return childNode;
}
}
// If the matching node is not found OR if there were no child nodes then return null
return null;
}
protected void Button1_Click(object sender, EventArgs e)
{
TreeNode trnode=FindNodeByValue(TreeView1.Nodes, fieldFilterTxtBx.Text);
if (trnode != null)
{
TreeView1.Nodes.Clear();
// TreeNode newnode = new TreeNode("Detail Engineering");
// TreeView1.Nodes.Add(newnode);
TreeView1.Nodes.Add(trnode);
TreeView1.ExpandAll();
}
else
{
Label1.Text = "No file found";
}
It is only returning one value because the function only calls itself recursively if no file is found. You need to add the recursion to this branch of the if statement in SearchChildNodes as well:
You also may need to add the filenames to an array or a Generic.List in order to store more than one at a time.