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:
ComboBox
pour afficher la liste des éléments et sélectionner le texte dans la variable ComboBox
.Est-ce un bug dans la ComboBox
? J'utilise Windows 7 si cela compte. Est-ce que je configure le ComboBox
wrong 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.
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.
Ajoutez une seule ligne de code à votre événement ComboBox
KeyDown
et le problème est résolu!
private void comboBox_NameAndID_KeyDown(object sender, KeyEventArgs e)
{
comboBox_NameAndID.DroppedDown = false;
}
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;
}
Ajoutez à l'événement/a une pression sur une touche.
Dim box As ComboBox = sender
box.DroppedDown = False
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
Sélectionnez la zone de liste déroulante dans la vue Conception et définissez "Aucun" sur la propriété AutoCompleteMode.
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);
}
}
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.
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.
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 :)