Help to filter in TreeView

sblb 1,231 Reputation points
2024-11-06T20:32:35.2633333+00:00

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

User's image

Structure of the treeview after the search

User's image

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();    
}

Blazor
Blazor
A free and open-source web framework that enables developers to create web apps using C# and HTML being developed by Microsoft.
1,602 questions
{count} votes

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.