Help to filter in TreeView
sblb
1,231
Reputation points
Hi, I've a blazor hybrid maui application and I have put the treeview.
I have created a service to search for files in the tree structure and a text input for the search. My problem is that when I select a file in the search zone the nodes are filtered where the file is located but I also see the other files in this directory;
do you have any idea where I made the mistake or did I forget something? thank you for your help.
Structure of the treeview before the searching
Structure of the treeview after the search
Hereafter the method
public async Task<List<FileNode>> SearchTreeNodesAsync(List<FileNode> nodes, string searchTerm, List<string> debugMessages)
{
// Effacez les anciens messages de débogage avant chaque recherche
debugMessages.Clear();
debugMessages.Add($"Début de la recherche pour le terme : {searchTerm}");
if (string.IsNullOrWhiteSpace(searchTerm))
{
debugMessages.Add("Le terme de recherche est vide, retour de tous les nœuds.");
return nodes;
}
var result = new List<FileNode>();
foreach (var node in nodes)
{
debugMessages.Add($"Recherche dans le nœud : {node.Name}");
// Vérifie si le nom du nœud contient le terme de recherche
bool isMatch = node.Name.Contains(searchTerm, StringComparison.OrdinalIgnoreCase);
if (isMatch)
{
debugMessages.Add($"Correspondance trouvée : {node.Name}");
// Si le nœud correspond, ajoute-le directement au résultat sans enfants
result.Add(new FileNode
{
Name = node.Name,
Path = node.Path,
IsDirectory = node.IsDirectory,
Children = new List<FileNode>() // Pas besoin de charger les enfants ici
});
}
else if (node.IsDirectory)
{
debugMessages.Add($"Le nœud {node.Name} est un dossier, chargement des enfants...");
// Charge dynamiquement les enfants si nécessaire
if (node.Children == null || node.Children.Count == 0)
{
node.Children = await LoadSubdirectoriesAsync(node.Path);
node.Children.AddRange(await LoadDirectoryAsync(node.Path));
debugMessages.Add($"Enfants chargés pour le dossier : {node.Name}, Nombre d'enfants : {node.Children.Count}");
}
// Recherche parmi les enfants du dossier
var filteredChildren = await SearchTreeNodesAsync(node.Children, searchTerm, debugMessages);
if (filteredChildren.Count > 0)
{
debugMessages.Add($"Des enfants correspondent au terme de recherche dans le dossier : {node.Name}");
// Crée un nouveau dossier avec uniquement les enfants correspondants
result.Add(new FileNode
{
Name = node.Name,
Path = node.Path,
IsDirectory = true,
Children = filteredChildren // Ajoute uniquement les enfants qui correspondent
});
}
else
{
debugMessages.Add($"Aucun enfant correspondant trouvé dans le dossier : {node.Name}");
}
}
}
debugMessages.Add($"Recherche terminée, nombre de résultats trouvés : {result.Count}");
return result;
}
razor page
private async Task SearchInTree(int treeNumber)
{
switch (treeNumber)
{
case 1:
// Utilisez le debugMessages pour capturer chaque étape de la recherche
filteredTree1 = await FileService.SearchTreeNodesAsync(tree1, searchTerm1, debugMessages);
if (!filteredTree1.Any())
{
debugMessages.Add("Aucun résultat trouvé.");
}
else
{
debugMessages.Add($"{filteredTree1.Count} résultat(s) trouvé(s)");
}
break;
}
StateHasChanged();
}
Sign in to answer