Winformes ComboBox DropDown et la fenêtre Autocomplete les deux apparaissent
j'ai un 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 alors ces étapes quand la fenêtre s'ouvre:
- cliquez sur le
ComboBox
liste déroulante -- cela affiche la liste des éléments et sélectionne le texte dans leComboBox
- de Type '5', '1' ... c'est à dire que je suis à la recherche d'utiliser la saisie semi-automatique pour rechercher 515, 516, etc.
- vous verrez que la fenêtre autocomplete apparaît maintenant en haut de la liste déroulante. Cependant si j'ai de la souris plus, c'est la fenêtre de chute cachée derrière la fenêtre autocomplete qui reçoit les événements de la souris, y compris le clic. Donc je pense que je clique sur un item autocomplete mais en fait je clique sur quelque chose de totalement aléatoire que je ne peux pas voir.
Est-ce un bug dans le ComboBox
? J'utilise Windows 7 si ça compte. Suis-je configurer le ComboBox
mal en quelque sorte?
Notez aussi que l'utilisation du clavier utilise le menu déroulant autocomplete. Donc les flèches Haut/Bas sont utiliser la fenêtre avant, mais la souris utilise la fenêtre arrière.
10 réponses
pas de problème pour obtenir un repro pour cela simplement en définissant les propriétés du PropertyGrid. Se comporte de cette façon à la fois dans Win7 et Windows XP.
C'est cassé le comportement documenté dans ce article. Comme indiqué, Microsoft n'envisage pas de correction. Une solution possible est de désactiver autocomplete dans un handler D'événement DropDown et de le réactiver dans un handler D'événement Dropdownclosé.
Ajouter une seule ligne de code à votre ComboBox
KeyDown
événement 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 de l'encodage et je perds de nombreuses heures à chercher à le corriger im mon projet. Et ici, je l'ai vu en quelques secondes!!!
Mon code ressemble à cela:
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;
}
Ajouter/un événement keypress.
Dim box As ComboBox = sender
box.DroppedDown = False
C'est weired. Votre code me semble très bien et j'ai utilisé cette fonction AutoComplete plusieurs fois et elle n'a pas montré à la fois le DropDown et la liste AutoComplete.
Ma suggestion serait
définir la source de données après les membres Display/Value. Je ne sais plus pourquoi, mais l'autre a causé des problèmes.
comboBox1.ValueMember = "ID"; comboBox1.DisplayMember = "Display"; comboBox1.DataSource = t;
définir la source AutoCompleteSource à la fin de votre code (après avoir ajouté DataSouce)
Peut-être cela peut vous aider.
pour avoir un seul ouvert à la fois vous pouvez utiliser comboBox1.Droppeddown = true ouvrir l'ordinaire, la faux de la saisie semi-automatique n'apparaîtra
il vous suffit d'ajouter un article dans collection.
Maintenant allez propriétés option de la boîte bascule choisir AutoCompleteSource=ListItems AutocompleteMode=suggest
remarque: la saisie semi-automatique de la source ont de nombreuses options selon vos besoins :)
WinForms Zone De Liste Déroulante Liste Déroulante...la réponse est celle-ci...
écrivez le code ci-dessous dans l'événement enter de comboBox1..
private void comboBox1_Enter(object sender, EventArgs e)
{
comboBox1.DroppedDown = true;
}
maintenant pour comboBox1 AutoComplete...
écrire ce AutoComplete()
au chargement de la page de l'événement..donc il travail...
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);
}
}
sélectionnez le ComboBox à partir de la vue design et définissez "None" à la propriété AutoCompleteMode.
sélectionnez le ComboBox à partir de la vue design et réglez "ajouter" à la propriété AutoCompleteMode, cela suggérera l'élément sans avoir une fenêtre.