Переопределить Winforms Автозаполнение ComboBox Предложить правило - PullRequest
13 голосов
/ 14 февраля 2010

Я пытаюсь изменить поведение ComboBox для Windows.Forms, чтобы в раскрывающемся списке автозаполнения отображались элементы в соответствии с указанными правилами.

По умолчанию, если вы используете автозаполнение в ComboBox, соблюдайте правило «строка s включается в выпадающий список, если (s.StartsWith (userEnteredTextInTheComboBox))» «Все, что меня действительно интересует, это замена нового правила для текущего, но я не могу найти способ добраться до него. (В частности, я бы предпочел s.Contains вместо s.StartsWith.)

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

Обновление: я нашел по существу тот же вопрос после еще нескольких поисков. Ответ, представленный там, предполагает, что использование двух элементов управления для «подделки» - путь.

Ответы [ 2 ]

18 голосов
/ 09 октября 2012

У меня была такая же проблема, и я искал быстрое решение.

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

Идея состоит в том, чтобы заново создавать комбо-список после каждого нажатия клавиши. Таким образом, мы можем положиться на встроенный интерфейс комбо, и нам не нужно реализовывать наш собственный интерфейс с текстовым полем и списком ...

Просто не забудьте установить combo.Tag на null, если вы перестроите список параметров комбо.

private void combo_KeyPress(object sender, KeyPressEventArgs e) {
    comboKeyPressed();
}

private void combo_TextChanged(object sender, EventArgs e) {
    if (combo.Text.Length == 0) comboKeyPressed();
}

private void comboKeyPressed() {
    combo.DroppedDown = true;

    object[] originalList = (object[])combo.Tag;
    if (originalList == null) {
        // backup original list
        originalList = new object[combo.Items.Count];
        combo.Items.CopyTo(originalList, 0);
        combo.Tag = originalList;
    }

    // prepare list of matching items
    string s = combo.Text.ToLower();
    IEnumerable<object> newList = originalList;
    if (s.Length > 0) {
        newList = originalList.Where(item => item.ToString().ToLower().Contains(s));
    }

    // clear list (loop through it, otherwise the cursor would move to the beginning of the textbox...)
    while (combo.Items.Count > 0) {
        combo.Items.RemoveAt(0);
    }

    // re-set list
    combo.Items.AddRange(newList.ToArray());
}
2 голосов
/ 23 февраля 2010

До Windows Vista объект автозаполнения сопоставлял кандидатов только с префиксом , поэтому вам нужно приготовить свой собственный .

Если вам нужно сбросить список предложений, когда он виден, используйте IAutoCompleteDropDown :: ResetEnumerator .

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