web-dev-qa-db-fra.com

WinForms ComboBox DropDown et la fenêtre de saisie semi-automatique apparaissent tous les deux

J'ai une ComboBox sur une application winforms avec ce code:

comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;

DataTable t = new DataTable();
t.Columns.Add("ID", typeof(int));
t.Columns.Add("Display", typeof(string));

for (int i = 1; i < 2000; i++)
{
    t.Rows.Add(i, i.ToString("N0"));
}

comboBox1.DataSource = t;
comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "Display";

Je suis ensuite ces étapes quand la fenêtre s'ouvre:

  1. Cliquez sur le bouton déroulant ComboBox pour afficher la liste des éléments et sélectionner le texte dans la variable ComboBox.
  2. Tapez '5', '1' ... c’est-à-dire que je cherche à utiliser la saisie semi-automatique pour rechercher 515, 516, etc.
  3. Vous verrez que la fenêtre de saisie semi-automatique apparaît maintenant AU DESSUS de la liste déroulante. Cependant, si je passe la souris sur la souris, c'est la fenêtre déroulante masquée située derrière la fenêtre de saisie semi-automatique qui reçoit les événements de la souris, y compris le clic. Je pense donc que je clique sur un élément à remplissage automatique, mais que je clique en fait sur quelque chose de totalement aléatoire que je ne peux pas voir.

Est-ce un bug dans la ComboBox? J'utilise Windows 7 si cela compte. Est-ce que je configure le ComboBoxwrong en quelque sorte?

Notez également que l’utilisation du CLAVIER utilise le menu déroulant autocomplete. Les touches fléchées haut/bas utilisent donc la fenêtre avant, mais la souris utilise la fenêtre arrière.

 enter image description here

28
Clyde

Aucun problème pour obtenir une repro pour cela simplement en définissant les propriétés à partir de PropertyGrid. Se comporte de cette façon à la fois sous Win7 et Windows XP.

Ce comportement est décrit dans cet article feedback . Comme indiqué, Microsoft n'envisage pas de solution. Une solution possible consiste à désactiver la saisie semi-automatique dans un gestionnaire d'événements DropDown et à l'activer à nouveau dans un gestionnaire d'événements DropDownClosed.

20
Hans Passant

Ajoutez une seule ligne de code à votre événement ComboBoxKeyDown et le problème est résolu!

private void comboBox_NameAndID_KeyDown(object sender, KeyEventArgs e)
{
    comboBox_NameAndID.DroppedDown = false;
}

La source

21
Joe Gayetty

Je suis un étudiant brésilien en encodage et je perds de nombreuses heures à chercher une solution dans mon projet. Et là, je l'ai vu en quelques secondes !!!

Mon code ressemble à ceci:

private void populateCombos()
    {
        persist.ShowLst(dspMember, vlMember,varTable,lstBox,varWhere);
        persist.ShowLst(dspMember, vlMember,varTable,ddlist1,varWhere);
        persist.ShowLst(dspMember, vlMember,varTable, ddlist2,varWhere);

        ddList1.Text = null;
        ddList2.Text = null;

        lstBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        lstBox.AutoCompleteSource = AutoCompleteSource.ListItems;
        lstBox.Text = null;
    }
2
Wilton Alves

Ajoutez à l'événement/a une pression sur une touche.

    Dim box As ComboBox = sender
    box.DroppedDown = False
1
ComboBoxNerd

si vous ne pouvez en ouvrir qu’une à la fois, vous pouvez utiliser la liste déroulante comboBox1.Droppeddown = true pour ouvrir la valeur normale, false, la saisie semi-automatique n’apparaîtra que

0
AC25

Sélectionnez la zone de liste déroulante dans la vue Conception et définissez "Aucun" sur la propriété AutoCompleteMode.

0
Saurav Das

WinForms ComboBox DropDown ... la réponse est la suivante ...
écrire ci-dessous le code dans comboBox1 Entrer un événement ..

private void comboBox1_Enter(object sender, EventArgs e)
{
    comboBox1.DroppedDown = true;
}

Maintenant pour comboBox1 AutoComplete ...
écrivez cette AutoComplete() dans un événement de chargement de page..si ça marche ...

public void AutoComplete()
{
    try
    {
        MySqlConnection conn = new 
        MySqlConnection("server=localhost;database=databasename;user
            id=root;password=;charset=utf8;");
        MySqlCommand cmd = new MySqlCommand("select distinct
            (columnName) from tablename", conn);
        DataSet ds = new DataSet();
        MySqlDataAdapter da = new MySqlDataAdapter(cmd);
        da.Fill(ds, "tablename");
        AutoCompleteStringCollection col = new
        AutoCompleteStringCollection();

        int i = 0;
        for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
        {
            col.Add(ds.Tables[0].Rows[i]["columnName"].ToString());
        }
        comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
        comboBox1.AutoCompleteCustomSource = col;
        comboBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
        if (conn.State == ConnectionState.Open)
        {
            conn.Close();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
    MessageBoxIcon.Error);
    }
}
0
Lalit

C'est weired. Votre code me semble bien et j'ai utilisé cette fonction de saisie semi-automatique à plusieurs reprises sans afficher à la fois les listes DropDown et AutoComplete.

Ma suggestion serait

  • Définissez la source de données après les membres d'affichage/de valeur. Je ne me souviens pas pourquoi mais l'autre a causé des problèmes.

    comboBox1.ValueMember = "ID";
    comboBox1.DisplayMember = "Display";
    comboBox1.DataSource = t;
    
  • Définissez AutoCompleteSource à la fin de votre code (après avoir ajouté le DataSouce)

Peut-être que ça aide.

0
Jürgen Steinblock

Sélectionnez la zone de liste déroulante dans la vue Conception et définissez "Ajouter" sur la propriété AutoCompleteMode. Cela suggérera l'élément sans afficher une fenêtre.

0
Saurav Das

Vous ajoutez simplement un élément dans la collection.

Maintenant, allez dans les propriétés de la liste déroulante, choisissez AutoCompleteSource = ListItems AutocompleteMode = suggérer

remarque: les sources de saisie semi-automatique ont de nombreuses options selon vos besoins :)

0
vivek verma