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 :

Databinding dynamique pour autocomplétion


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 20
    Points
    20
    Par défaut Databinding dynamique pour autocomplétion
    Hello tout le monde,

    J'ai besoin d'un binding dynamique depuis base de données pour remplir une combobox avec autocomplétion pour mon application.

    Je m'explique: Je voudrai qu'au fur et à mesure que j'écris dans la combobox, celle-ci se mette à jour avec les possibilités liées à ce que j'ai écrit.

    Pour cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    essaiList = new List<string>(GetCompletionList());
    ultraComboEditor1.DataSource = essaiList;
    Je créé ma liste essaiList et je l'initialise avec la méthode qui me permet de récupérer les infos de la base.
    Je bind ensuite cette liste avec ma comboBox.
    Au démarrage de l'application, ça marche, ma liste est affichée.

    En revanche, ma méthode GetCompletionList() est supposée requêter la base à partir de ce que j'écris dans ma combobox. Voici la méthode:

    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
    public List<string> GetCompletionList()
            {
                List<string> complList = new List<string>();
                AseConnection conn = DbConnectionFactory.Instance.CreateSybaseAdoNetConnection();
                
                AseCommand cmd = new AseCommand("SELECT nom, prn FROM table WHERE nom like '" + ultraComboEditor1.Text.ToUpper() + "%'", conn);
                conn.Open();
                AseDataReader reader = cmd.ExecuteReader();
                while(reader.Read())
                {
                    complList.Add(reader["nom"].ToString() +", "+ reader["prn"].ToString());
                }
                reader.Close();
                conn.Close();
                return complList;
            }
    La liste est donc bindée sur quelquechose qui change et devrait donc a priori changer elle-même, seulement voilà, ça ne change pas.. Les noms dans ma comboBox restent les mêmes..

    Une idée ?

    Merci

  2. #2
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut
    Si tu configure plusieurs combobox "Autocomplete" bindé à une seule table dans le même formulaire, tu change un item dans une combobox les autres changes automatiquement.
    Pour éviter ce problème, j'ai due utilisé un mode "déconnecté" et je met à jour quand l'utilisateur ajoute un élément dans la table des éléments "Autocomplete". (Je dis n'importe quoi n'importe comment!)

    Commence par créer une classe qui contiendra les éléments à sélectionner dans la combo. Dans le code qui suit c'est une classe minimaliste qui contienne le couple ID et Nom. ID est comme d'habitude l'ID unique d'un enregistrement dans une table.

    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
     
        public class IDNameItem
        {
            private int id = 0;
            private string name = string.Empty;
     
            public IDNameItem(int paramID, string paramName)
            {
                this.id = paramID;
                this.name = paramName;
            }
     
            public int ID
            {
                get { return id; }
                set { id = value; }
            }
     
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
        }
    Ensuite, dans l'événement Load ou autre, tu créé la liste à partir d'un Reader ou une DataTable ou autre. Dans le cas de ce post, je vais l'initialisée manuellement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                // Initialiser la liste
                array = new System.Collections.ArrayList();
                array.Add(new IDNameItem(1, "Ceci est une phrase."));
                array.Add(new IDNameItem(2, "Celle là est encore une phrase."));
                array.Add(new IDNameItem(3, "Pour diversifier les choix."));
    Enfin, configure la combobox pour l'Autocomplete.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                // Lier avec la combo
                comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;
                comboBox1.DisplayMember = "Name";
                comboBox1.ValueMember = "ID";
                comboBox1.DataSource = array;
    Je vais garder le projet testlab au cas où quelque chose cloche avec ce post, n'hésite pas surtout.

    PS : Pour lier directement une DataTable à une combobox pour la fonctionnalité AutoComplete, tu peux jouer sur les propriétés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;
                comboBox1.DisplayMember = "Nom_colonne_texte";
                comboBox1.ValueMember = "Nom_colonne_ID";
                comboBox1.DataSource = Objet_DataTable;
    Comme tu peux configurer la combobox à l'aide de la fenêtre Propriétés.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Merci emmr.rida pour ta réponse très détaillée! En revanche je n'ai pas dû bien exprimer mon problème! L'autocomplétion marche très bien dans ma comboBox, ce qui ne marche pas, c'est la restriction de la saisie.

    Je m'explique:

    Mettons que ma comboBox contienne les strings suivants:

    Canevas
    Corollaire
    Connecticut
    Continuer

    Je voudrai que l'utilisateur tappe "C", la lettre suivante ne soit pas acceptée si elle n'est pas un "o" ou un "a". Ensuite, lorsque l'utilisateur aura tappé "Co" par exemple, il ne doit pouvoir que tapper "Cor" ou Con"... et ainsi de suite!

  4. #4
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut
    Tu peux intercepter l'événement KeyPress dans lequel tu récupére la partie non sélectionnée du texte de la combobox, compose la future string en concaténant la partie non sélectionné avec le e.KeyChar et vérifier la présence du résultat dans la liste de la combobox à l'emplacement 0 de l'indice retourné par ComboBox.FindString(). Si aucune occurence trouvé tu met et pour refuser la touche pressée non valide et enfin un Beep pour signaler l'erreur à l'utilisateur.

    A toi de coder et de faire attention dans le cas du premier caractère et aux caractères de contrôle.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Tiens pas bête je vais essayer ça, j'y avais pas pensé !

    Dans le même style, j'aimerai que lorsque j'appuie sur Entrée, ça me valide mon choix dans ma comboBox, alors qu'actuellement ça me fait un Clear() de ce que j'ai écrit...Une fois la touche entrée captée, je n'arrive pas à trouver la propriété qui me permet de sélectionner l'item ! Tu sais laquelle c'est ?

    if (e.KeyCode == Keys.Enter)
    {
    //Code pour selectionner l'item en surbrillance dans la liste
    }

    Merci beaucoup pour ton temps en tout cas

  6. #6
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut
    Fais un ComboBox.FindString pour trouver l'élément dans la liste.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    J'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (e.KeyCode == Keys.Enter)
                {
                    comboBox1.FindString(comboBox1.Text);
                }
    Ca ne marche pas..La touche Entree fait toujours un Clear().
    En gros, je voudrai pouvoir me déplacer dans la liste d'autocomplétion et valider avec Entrée l'item choisi.

  8. #8
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut
    Essais ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (e.KeyCode == Keys.Enter)
                {
                    comboBox1.SelectedIndex = comboBox1.FindString(comboBox1.Text);
                }

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Non toujours pas

    En fait j'ai vraiment l'impression que la touche Entrée est bindée à une action cLear(), c'est très bizarre.

    On peut désactiver l'action de la touche Entrée ?

    Car dans ma méthode, si je ne mets rien, ça fait quand même un clear, alors que ça ne devrait rien faire..

Discussions similaires

  1. [DB2] SQL dynamique pour déclarer un curseur
    Par Fatah93 dans le forum DB2
    Réponses: 3
    Dernier message: 12/12/2006, 13h06
  2. [FLASH MX] Un menu dynamique pour des vidéos .flv
    Par Edoxituz dans le forum Flash
    Réponses: 10
    Dernier message: 12/02/2006, 15h46
  3. Delphi7-DOA : procédure dynamique pour ramener les données?
    Par delphim dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/12/2004, 18h26

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