Répondre à: Recherche menu déroulant

  • R3dKap

    Membre
    13 décembre 2021 à 11h04

    @Lamia dans ce cas, et au vu de ta réponde aux questions de @Loïc Cimon, la solution la plus simple que j’entrevois pour toi c’est de procéder de la manière suivante…

    J’ai supposé dans le code que ta liste des codes postaux et communes s’appelle Communes et que les colonnes s’appellent CodePostal et NomCommune.

    Voici les instructions :

    • sur ton écran tu mets une seule combo box (en FR, une Zone de liste déroulante, pas une Liste déroulante) appelée ComboBox1
    • au-dessus de ta combo box, tu mets un text input (en FR, Entrée de texte) appelé TextInput1
    • sur la propriété OnChange de TextInput1, tu mets ceci :
    Clear(colCommunes);nIf(n    Not(IsBlank(TextInput1.Text)),n    If(n        IsNumeric(TextInput1.Text),n        Collect(n            colCommunes,n            Filter(n                Communes,n                StartsWith(n                    CodePostal,n                    TextInput1.Textn                )n            )n        ),n        Collect(n            colCommunes,n            Filter(n                Communes,n                StartsWith(n                    NomCommune,n                    TextInput1.Textn                )n            )n        )n    )n)n
    • définit la propriété IsSearchable de ComboBox1 à false
    • sur la propriété Items de ComboBox1 tu mets juste :
    colCommunesn
    • sur ComboBox1 tu cliques sur le lien Edit de Fields :

    • là tu changes le Layout et tu le définis sur Double :

    • puis dans Primary text et Secondary text tu mets respectivement tes colonnes de code postal et de commune :

    • et enfin, dans la propriété DisplayMode du ComboBox1 tu mets ceci :
    If(IsEmpty(colCommunes), DisplayMode.Disabled, DisplayMode.Edit)n

    Quelques explications…

    En gros, l’idée c’est tout d’abord d’utiliser une combo box en mode double pour afficher à la fois le code postal et la commune dans un seul composant :

    Ensuite, on ne peut malheureusement pas utiliser la recherche intégrée à la combo box car il y a plus de 2 000 éléments dans ta liste. Or la fonction Search() (qui est utilisée derrière pour faire cela) n’est pas délégable à SharePoint, c’est à dire que Power Apps ne peut pas dire à SharePoint “Fais la recherche pour moi” il est obligé de la faire lui-même. Et du coup, pour des raisons de performances, Power Apps ne fait la recherche que sur 2 000 enregistrements max.

    Du coup, pour contourner ce problème, on va utiliser une autre fonction qui, elle, est délégable à SharePoint : StartsWith().

    On mets donc un text input sur l’écran pour permettre à l’utilisateur de saisir son critère de recherche. Or, si on avait fait un StartsWith() sur un champ de type “1000-Bruxelles“, on aurait pu faire la recherche que sur le code postal et si on avait tapé “Brux” il n’aurait rien trouvé puisque la fonction StartsWith() ne compare la chaîne de recherche qu’avec le début de la valeur du champ (comme son nom l’indique d’ailleurs).

    C’est la raison pour laquelle dans le gros morceau de code fournit ci-dessus, on regarde si ce que l’utilisateur a saisit est un numérique (alors on fait un StartsWith() sur le code postal) ou une chaîne de caractères (auquel cas on fait un StartsWith() sur la commune).

    Le résultat du filtrage des communes avec l’un ou l’autre des StartsWith() est stocké dans une collection locale colCommunes et c’est elle qui alimente la combo box.

    Enfin, pour éviter que l’utilisateur n’ouvre la combo box alors qu’il vient de lancer une recherche et que l’on a pas encore les résultats du filtrage, on verrouille la combo box tant qu’il n’y a pas de données dans colCommunes. C’est le but du code que l’on a mit sur la propriété DisplayMode de ComboBox1.

    La seule chose à savoir pour l’utilisateur c’est qu’il doit appuyer sur <ENTREE> après avoir saisi son critère de recherche dans TextInput1 pour que cela déclenche la recherche et le filtrage des communes.

    Voilà ce que ça donne :

    Alors tu remarqueras que j’ai aussi mis une List box (à utiliser à la place de la combo box) qui peut être plus pratique pour afficher directement la liste des communes disponibles. Cela évite de devoir ouvrir la combo box pour voir le résultat du filtrage.

    Pour que cela fonctionne bien, il suffit de positionner ses propriétés ainsi :

    • Items :
    AddColumns(n    colCommunes,n    "CPCommune",n    CodePostal & " - " & NomCommunen)n
    • SelectMultiple à false

    Puis, choisit bien la colonne CPCommune pour l’affichage des valeurs :

    Et histoire de faire plus propre, pour faire en sorte que la liste se vide au moment où on veut faire une nouvelle recherche, définit la propriété OnSelect de TextInput1 à :

    Clear(colCommunes)n

    Voili voilou… Dis-nous si ça fonctionne chez toi…

    SubCommentID=fuxsTPvWHBXWyrE, CommentID=WXr4IG1uohXeSl9, PostID=V61aoLRCRNFfTPX