IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

textbox de type "AutoComplete"


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 128
    Points : 61
    Points
    61
    Par défaut textbox de type "AutoComplete"
    Bonjour,

    Je suis sous VS 2019 / C# / Winform / Framework 4.5.2


    je n'arrive pas à faire une textbox de type "AutoComplete"

    J'ai un formule de contact, 2 champs visible (textbox : Commune / Code Postal), 1 caché (label : CodeInsee)

    j'ai une base de donnée SQL Server qui contient les communes avec les 3 champs.

    je me suis fais une classe "Commune" contenant les 3 champs
    je me suis fais une classe "Insee" qui contient une méthode static public "GetCommunes" qui me retourne un list<Commune> via Linq

    je ne poste pas le code qui est des plus basiques.

    le but étant : si je tape dans un textbox ça suggère et affecte l'autre textbox et le label

    j'ai dans un premier temps mis mon textbox "commune" via les propriétés :
    - AutoCompleteMode => "SuggestAppend"
    - AutoCompleteSource => "CustomSource"

    Après des recherches sur le net, j'essaie de définir la source "AutoCompleteCustom" via code en appelant mon GetCommunes, sauf qu'il semble que ce ne soit qu'une liste basique de strings.
    je ne vois pas comment faire sachant qu'il existe plusieurs communes ayant le même nom, et plusieurs communes ayant le même code postal, seul le code insee les distingues.

    le moyen serait de proposer lors de la saisie une concaténation des 3 et changer lors de l'affichage.
    il faut ensuite que j'arrive a affecter les 2 autres composants.

    d'avance merci de votre aide, je suis dans le flou le plus complet.
    -----------------------------------------
    à l'origine PHP/Mysql. Pro : Asp.net/Vb/SQL/Webform siteweb

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 681
    Points : 5 267
    Points
    5 267
    Par défaut
    L'autocomplète s'applique uniquement sur la texte box qui a le focus.
    Autrement dit, ça sert à compléter le texte que tu es en train de taper, ça ne sert pas pour remplir une autre texte box.

    Ce que tu peux faire en revanche, c'est changer la source d'un texte box lors de l'évènement Validating de l'autre, pour filtrer les résultat à autocompleter lors de la saisie de l'autre texte box.
    Cela implique de créer un AutoCompleteStringCollection contenant uniquement les code postaux ou les villes suivant le texte box modifé.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    private void City_Validating(object sender, CancelEventArgs e)
    {      
        if (String.IsNullOrWhiteSpace(ZipCode.Text))
        {
            var source = new AutoCompleteStringCollection();
     
            source.AddRange(GetZipCodesFromCityName(City.Text).ToArray());
            ZipCode.AutoCompleteSource = AutoCompleteSource.CustomSource;
            ZipCode.AutoCompleteCustomSource = source;
        }
        else
        {
            InseeCode.Text = GetInseeCodeFromCityNameAndZipCode(City.Text, ZipCode.Text);
        }
    }
     
    private void ZipCode_Validating(object sender, CancelEventArgs e)
    {
        if (String.IsNullOrWhiteSpace(City.Text))
        {
            var source = new AutoCompleteStringCollection();
     
            source.AddRange(GetCityNamesFromZipCode(ZipCode.Text).ToArray());
            City.AutoCompleteSource = AutoCompleteSource.CustomSource;
            City.AutoCompleteCustomSource = source;
        }
        else
        {
            InseeCode.Text = GetInseeCodeFromCityNameAndZipCode(City.Text, ZipCode.Text);
        }
    }
     
    private IEnumerable<String> GetZipCodesFromCityName(String name)
    {
        var internalName = name.Trim();
     
        var result = new List<String>();
     
        /* Effectuer ici, la recherche et l'ajout des codes postaux */
     
        return result;
    }
     
    private IEnumerable<String> GetCityNamesFromZipCode(String zipCode)
    {
        var internalZipCode = zipCode.Trim();
     
        var result = new List<String>();
     
        /* Effectuer ici, la recherche et l'ajout des codes nom de villes */
     
        return result;
    }
     
    private String GetInseeCodeFromCityNameAndZipCode(String name, String zipCode)
    {
        var internalName = name.Trim();
        var internalZipCode = zipCode.Trim();
     
        return ""; // A remplacer par la recherche du Code Insee correspondant
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 128
    Points : 61
    Points
    61
    Par défaut
    Bonjour,

    Merci pour ta réponse, je viens de la mettre en application.
    j'ai été un peu dérouté au début quand on tape dans les textbox, rien n'est proposé.
    exemple que j'ai fais, j'ai tapé 59400, (j'ai du faire TAB pour prise en compte du validating) puis j'ai tapé "C" ça ma proposé CAMBRAI etc.. nickel, mais j'ai quand même pu taper PARIS.

    Mais si je fais un système de "Vidage" de la saisie si incorrecte, ça permettra plus de taper par exemple paris pour ensuite taper son code postal.
    ce que je peux ajouter, c'est si 1 réponse existe : automatiquement la mettre dans l'autre textbox.

    c'est pas loin ! mais je veux éviter un max les mauvaises saisies, nos bases en sont pleines d'où la restriction basé sur notre table insee.
    dans d'ancien logiciel (web) j'avais une popup de recherche par CP / Commune, une grille qui afficher les choix dans une grille et un double clique permettait de sélectionné .

    à part le refaire ici quand on clic sur la textbox...
    -----------------------------------------
    à l'origine PHP/Mysql. Pro : Asp.net/Vb/SQL/Webform siteweb

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 681
    Points : 5 267
    Points
    5 267
    Par défaut
    j'ai été un peu dérouté au début quand on tape dans les textbox, rien n'est proposé.
    exemple que j'ai fais, j'ai tapé 59400, (j'ai du faire TAB pour prise en compte du validating)
    C'est le comportement normal du Validating.

    puis j'ai tapé "C" ça ma proposé CAMBRAI etc.. nickel, mais j'ai quand même pu taper PARIS.
    Cela vient du fait que tu utilise un textbox, c'est une saisie libre.
    Tu n'aurais pas ce problème en filtrant les valeurs sur une combo.

    c'est pas loin ! mais je veux éviter un max les mauvaises saisies, nos bases en sont pleines d'où la restriction basé sur notre table insee.
    dans d'ancien logiciel (web) j'avais une popup de recherche par CP / Commune, une grille qui afficher les choix dans une grille et un double clique permettait de sélectionné .

    à part le refaire ici quand on clic sur la textbox...
    Je t'ai donné un code pour satisfaire à ta demande initiale avec les contraintes initiales.
    Il apparait évident que ce fonctionnement n'est pas adapté et tu site toi même un meilleur système.
    En effet, refaire un système équivalent aux logiciels que tu décrit serait un bon moyen d'éviter les erreurs.
    Mais j'évitera le clic sur le textbox. Soit je mettrai un bouton, soit je déclencherai l'affichage de la grille à la sortie du textbox en analysant le contenu.
    Genre si tu n'as que des chiffres, tu fait une recherche sur le CP et affiche les villes filtrée dans la grilles, idem si tu n'as que des lettre.
    Si tu as les deux tu les sépares en deux et tu fais ton filtre sur les deux.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 128
    Points : 61
    Points
    61
    Par défaut
    Bonjour,

    j'ai finalement réussi en procédant autrement, en trouvant un exemple qui faisait ceci, je l'ai ensuite adapté :

    une textbox qui quand on tape dedans au bout d'un certain nombre de lettre, affiche un panel qui contient une listbox, l'autosuggestion est ajouté dynamiquement et au clic ou autre évènement, le texte est recopier dans la textbox.

    j'ai adapté de la manière suivante :

    j'ai bindé à la listbox mon objet "Insee", j'ai mes 3 property (codeInsee, CodePostal,Commune) puis une property qui concatène "Commune (CodePostal)"
    pour la listbox j'ai du coup comme value mon codeInsee et text ma concaténation.

    j'ai du adapté la sélection pour que ça me renvoi l'objet (c'est mieux quand web) au lieu du texte, ça me met le résultat dans une property pour l'accès externe, et génère un évènement comme quoi la sélection a été faite.

    au moment de l'événement je lis cette property pour alimenté mes 3 éléments :
    Textbox Commune (en enabled=false)
    Textbox CodePostal (en enabled=false)
    labelInsee Commune (en visible=false)

    ainsi lors de la sauvegarde de mon formulaire je peux reprendre les 3 champs.

    merci de votre aide, j'enchaine maintenant sur un autre problème, ou j'ai déjà passé la journée d'hier. mais là c'est un autre Post.
    -----------------------------------------
    à l'origine PHP/Mysql. Pro : Asp.net/Vb/SQL/Webform siteweb

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Caractères du type \', &quot, etc
    Par CE.KA dans le forum Langage
    Réponses: 5
    Dernier message: 19/11/2009, 00h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo