2010-02-15 1 views
0

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

Я мог бы просто нарисовать пробел .. но есть ли у кого-нибудь предложение? Заранее спасибо

+0

Я думал, что могу унаследовать от AutoCompleteCollection и переопределить add и get, но я могу только переопределить toString, getHashCode и Equals .... – irco

+0

Если вы отвечаете на ответ Джоша, вы должны отправить его на свой ответ. Что касается вашего комментария, вы можете реализовать другой метод с тем же именем, но с разными параметрами, чтобы перегрузить его. Вы можете только переопределять виртуальные члены, но всегда можете перегружать. –

+0

Вам не нужно «переопределять» (переопределить). Вместо этого вы добавляете перегрузку. Этот метод не заменяет существующий метод Add, который принимает один параметр, он добавляет дополнительный метод Add, который принимает 2 параметра. См. Мой пример в моем ответе. – Josh

ответ

2

Класс AutoCompleteStringCollection не запечатан, поэтому вы могли бы извлечь из него и создать перегрузку Add, которая принимает два параметра: ключ и значение.

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

class KeyedAutoCompleteStringCollection : AutoCompleteStringCollection { 

    private readonly Dictionary<string,string> keyedValues = 
     new Dictionary<string,string>(StringComparer.OrdinalIgnoreCase); 

    public void Add(string value, string key) { 
     base.Add(value); 
     keyedValues.Add(value, key); // intentionally backwards 
    } 

    public string Lookup(string value) { 
     string key; 
     if (keyedValues.TryGetValue(value, out key)) { 
      return key; 
     } 
     else { 
      return null; 
     } 
    } 

} 
0

Если я вас правильно понял, вы хотите значение в текстовом поле (которое может быть автоматически предложено), чтобы иметь связанное значение. Вы можете сделать это, создав в качестве ключа Dictionary<string, string> с текстом TextBox и тем, что вы называете «ключ» в качестве значения. Всякий раз, когда вы хотите найти «ключ» для определенного значения TextBox, вы можете проверить словарь для него.

Конечно, TextBox может быть не лучшим образом представлять ваши данные, если должен быть ключ. Если ключ должен быть ключом, ComboBoxDropDownStyle, установленным на ComboBoxStyle.DropDownList), может быть лучшим вариантом.

 Смежные вопросы

  • Нет связанных вопросов^_^