Как я могу реализовать добавочный поиск в списке? - PullRequest
5 голосов
/ 26 сентября 2011

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

Если у меня было три значения (AAB, AAC, AAD), тогда пользователь должен иметь возможность выбрать элемент в доступном списке и ввести AAC, и этот элемент должен быть выделен и находиться в фокусе. Это должно быть также в пошаговом режиме.

Как лучше всего справиться с этим?

Ответы [ 4 ]

6 голосов
/ 28 сентября 2013

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

Добавить обработчик к событию KeyChar (список имеет имя lbxFieldNames в моем случае):

private void lbxFieldNames_KeyPress(object sender, KeyPressEventArgs e)
{
  IncrementalSearch(e.KeyChar);
  e.Handled = true;
}

(Важно: вам нужно e.Handled = true;, потому что в списке по умолчанию реализован поиск «Перейти к первому элементу, начинающемуся с этого символа»; мне потребовалось некоторое время, чтобы выяснить, почему мой код не работал.)

Метод IncrementalSearch:

private void IncrementalSearch(char ch)
{
  if (DateTime.Now - lastKeyPressTime > new TimeSpan(0, 0, 1))
    searchString = ch.ToString();
  else
    searchString += ch;
  lastKeyPressTime = DateTime.Now;

  var item = lbxFieldNames
    .Items
    .Cast<string>()
    .Where(it => it.StartsWith(searchString, true, CultureInfo.InvariantCulture))
    .FirstOrDefault();
  if (item == null)
    return;

  var index = lbxFieldNames.Items.IndexOf(item);
  if (index < 0)
    return;

  lbxFieldNames.SelectedIndex = index;
}

Время ожидания, которое я реализовал, составляет одну секунду, но вы можете изменить его, изменив TimeSpan в операторе if.

Наконец, вам нужно объявить

private string searchString;
private DateTime lastKeyPressTime;

Надеюсь, это поможет.

3 голосов
/ 26 сентября 2011

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

Вы можете использовать ComboBox (вместо ListBox):

  1. Установите DataSource для вашего списка KeyValuePairs,
  2. Установите для ValueMember значение «Key» и для DisplayMember значение «Value»,
  3. Set AutoCompleteMode для SuggestAppend и
  4. Установка AutoCompleteSource для ListItems
2 голосов
/ 26 сентября 2011

Вы можете использовать событие TextChanged, чтобы срабатывать всякий раз, когда пользователь вводит символ, и вы также можете использовать событие listbox DataSourceChanged с ним, чтобы навести курсор на определенный элемент или что угодно.

Я приведу вам пример:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        listBox1.DataSource = GetProducts(textBox1.Text);
        listBox1.ValueMember = "Id";
        listBox1.DisplayMember = "Name";
    }

    List<Product> GetProducts(string keyword)
    {
        IQueryable q = from p in db.GetTable<Product>()
                       where p.Name.Contains(keyword)
                       select p;
        List<Product> products = q.ToList<Product>();
        return products;
    }

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

Существует также другой интересный способ сделать это: TextBox.AutoCompleteCustomSource Свойство :

textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoCompleteStringCollection stringCollection = 
    new AutoCompleteStringCollection();
textBox1.AutoCompleteCustomSource = stringCollection;

Этот список может занять только string[], поэтому вы можете получить их из своего источника данных, а затем при изменении текста textbox добавить аналогичные слова из вашего источника данных, которые были заполнены в текстовое поле автозаполненияПользовательский источник:

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        listBox1.Items.Clear();
        if (textBox1.Text.Length == 0)
        {
            listbox1.Visible = false;
            return;
        }

        foreach (String keyword in textBox1.AutoCompleteCustomSource)
        {
            if (keyword.Contains(textBox1.Text))
            {
                listBox1.Items.Add(keyword);
                listBox1.Visible = true;
            }
        }

    }

Добавить другое событие ListBoxSelectedindexchanged, чтобы добавить выделенный текст в текстовое поле

1 голос
/ 26 сентября 2011

Возможно, вы могли бы добавить событие для TextChanged в элементе управления, где пользователь печатает, - поиск (я предполагаю TextBox). В этом случае вы могли бы пройтись по всем элементам, чтобы найти тот, который наиболее соответствует словам, набранным пользователем.

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