Combobox и автозаполнение в C#

У меня небольшая проблема с опцией автозаполнения в combobox. Все работает правильно, за исключением того, что я хочу работать по-разному :)

когда я начинаю печатать в combobox, autusuggest работает так, как мне нравится:

Combo

но когда я впервые открываю combobox, а затем начинаю печатать, я получаю что-то вроде этого:

enter image description here

более того, я не могу выбрать элемент из автозаполнения combobox, только из этого списка под.

AutocompleteMode является SuggestAppend

Я хотел бы иметь автозаполнение, как на первом рисунке, и в таких ситуациях, как рисунок 2, Этот первый список combobox должен быть закрыт каким-то образом..

7 ответов


у меня была такая же проблема и решил ее таким образом:

private void comboBox_DropDown(object sender, EventArgs e)
{
    ComboBox cbo = (ComboBox)sender;
    cbo.PreviewKeyDown += new PreviewKeyDownEventHandler(comboBox_PreviewKeyDown);
}

private void comboBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    ComboBox cbo = (ComboBox)sender;
    cbo.PreviewKeyDown -= comboBox_PreviewKeyDown;
    if (cbo.DroppedDown) cbo.Focus();
}

после того, как пользователь нажимает на PreviewKeyDown событие прикреплено к этому ComboBox. Когда пользователь начинает печатать, только добавлена события. В этом случае мы проверяем, если ComboBox is DroppedDown, если это так, сосредоточиться, что ComboBox. On ComboBox фокус DropDown исчезает и все.


Как насчет использования в выпадающем списке и DropDownClosed события для отключения или изменения режима автозаполнения?


У меня была точно такая же проблема. Я попробовал выпадающие и DropDownClosed события, чтобы установить свойство AutoCompleteMode в none и предложить. В этом случае SelectedIndexChanged событие не запускается после выбора элемента с помощью мыши. Я использовал свойство SelectedValue в событии SelectedIndexChanged, и это свойство уже изменено в момент запуска события DropDownClosed. В моем случае я просто вызвал метод SelectedIndexChanged из Dropdownclosed событие для решения проблемы.


реализовать событие на ComboBox KeyDown. Это должно выглядеть так.

void cmbExample_KeyDown(object sender, KeyEventArgs e)
    {
        if ((sender as ComboBox).DroppedDown)
            (sender as ComboBox).DroppedDown = false;
    }

вы пробовали другие возможные значения AutoCompleteMode, которые Append, None и Suggest? Я думаю, что то, что вы ищете Suggest вместо AppendSuggest.

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


Я также обнаружил, что реализация пользовательского интерфейса по умолчанию отвлекает, поскольку два выпадающих списка сражаются за управление мышью.

вы хотите скрыть раскрывающийся список, когда отображаются предложения автозаполнения. Существует сообщение windows, которое combobox делает перед отображением предложений автозаполнения. Я решил свернуть капельницу в ответ на это сообщение. Для этого требуется небольшое переопределение combobox:

Public Class Combobox2
    Inherits ComboBox

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = 135 AndAlso DroppedDown Then 'WM_GETDLGCODE
            DroppedDown = False
        End If
        MyBase.WndProc(m)
    End Sub

End Class

void cmbExample_KeyDown(object sender, KeyEventArgs e)
{
  cmbExample.DroppedDown = false;
}