Появятся окна выпадающего списка WinForms ComboBox и автозаполнения - PullRequest
29 голосов
/ 17 июня 2010

У меня есть ComboBox в приложении winforms с этим кодом:

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";

Затем я открываю окно, выполняя следующие действия:

  1. Нажмите *Раскрывающаяся кнопка 1008 * - отображает список элементов и выделяет текст в ComboBox
  2. Тип '5', '1' ... т.е. я ищу использование автозаполнения для поиска515, 516 и т. Д.
  3. Вы увидите, что окно автозаполнения теперь появляется в верхней части раскрывающегося списка.Однако, если я наведу курсор мыши, это скрытое выпадающее окно за окном автозаполнения, которое получает события мыши, включая щелчок.Поэтому я думаю, что нажимаю на элемент автозаполнения, но на самом деле нажимаю на что-то совершенно случайное, чего я не вижу.

Это ошибка в ComboBox?Я использую Windows 7, если это имеет значение.Я неправильно настраиваю ComboBox?

Обратите внимание, что при использовании КЛАВИАТУРЫ используется раскрывающийся список автозаполнения.Таким образом, клавиши со стрелками вверх / вниз используют переднее окно, а мышь - заднее окно.

enter image description here

Ответы [ 10 ]

23 голосов
/ 18 февраля 2016

Добавьте одну строку кода к вашему ComboBox KeyDown событию, и проблема решена!

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

Источник

20 голосов
/ 18 июня 2010

Нет проблем с получением репродукции для этого, просто установив свойства из PropertyGrid. Так ведет себя как в Win7, так и в Windows XP.

Это некорректное поведение, документированное в этой статье отзыва . Как указано, Microsoft не рассматривает исправление. Один из возможных обходных путей - отключить автозаполнение в обработчике событий DropDown и повторно включить его в обработчике событий DropDownClosed.

2 голосов
/ 01 декабря 2014

Я бразильский студент, изучающий кодирование, и я теряю много часов, пытаясь исправить это в моем проекте. И вот, я увидел это за несколько секунд !!!

Мой код выглядит так:

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;
    }
1 голос
/ 05 мая 2014

Добавить к событию нажатия клавиши / a.

    Dim box As ComboBox = sender
    box.DroppedDown = False
0 голосов
/ 04 марта 2017

Выберите ComboBox в представлении конструктора и установите «Добавить» в свойстве AutoCompleteMode, это предложит элемент без появления окна.

0 голосов
/ 21 января 2017

Выберите ComboBox в представлении конструктора и установите для свойства «AutoCompleteMode» значение «Нет».

0 голосов
/ 19 сентября 2015

WinForms ComboBox DropDown ... ответ таков ...
напишите ниже код в comboBox1 Введите событие ..

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

Теперь для comboBox1 AutoComplete ...
напишите AutoComplete() в событии загрузки страницы ... так оно и работает ...

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 голосов
/ 18 июня 2015

Вы просто добавляете товар в коллекцию.

Теперь перейдите к варианту свойств в поле со списком и выберите AutoCompleteSource = ListItems AutoCompleteMode = предполагают

примечание: у источника автозаполнения есть много опций согласно вашему требованию:)

0 голосов
/ 07 апреля 2014

только для одного открытия за раз, вы можете использовать comboBox1.Droppeddown = true, открывать регулярное, false, автозаполнение будет отображаться только

0 голосов
/ 17 июня 2010

Это устало. Ваш код выглядит хорошо для меня, и я несколько раз использовал эту функцию автозаполнения, и она не показывала ни DropDown, ни список автозаполнения.

Мое предложение будет

  • Установите источник данных после элементов отображения / значения. Я не помню почему, но другой вызвал некоторые проблемы.

    comboBox1.ValueMember = "ID";
    comboBox1.DisplayMember = "Display";
    comboBox1.DataSource = t;
    
  • Установить AutoCompleteSource в конце вашего кода (после добавления DataSouce)

Может быть, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...