Элемент поиска в C # ListView без четкого списка

#c# #sorting #listview #search

#c# #сортировка #listview #Поиск

Вопрос:

У меня есть проект winform на платформе C #. У меня есть listview и textbox, как вы видите на рисунке ниже. Я хочу изменить порядок списка в соответствии с текстовым значением, введенным пользователем.

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

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

Я попробовал приведенные ниже коды, но это отправило элемент в конец списка, хотя я выбрал индекс 0. Спасибо.

введите описание изображения здесь

 private void txt_search_TextChanged(object sender, EventArgs e)
        {
            string text = txt_search.Text;
            var item = listView1.FindItemWithText(text);
            if (item != null)
            {
                int index = listView1.Items.IndexOf(item);

                if (index > 0)
                {
                    listView1.Items.RemoveAt(index);
                    listView1.Items.Insert(0, item);
                }
            }
        }
 

Комментарии:

1. Рассмотрите возможность использования ListView в виртуальном режиме для повышения производительности при отображении большого списка. Вы сможете выполнять более эффективные процедуры фильтрации / сортировки, потому что у вас есть контроль над отображаемыми данными.

2. ответ @Fixations сработал для меня. Спасибо за внимание.

Ответ №1:

ListView сортируется с помощью .Sort() функции, не уверен, каково поведение по умолчанию, но я думаю, вам нужен пользовательский компаратор.

Вот пример реализации с помощью (ab) с использованием ListViewItem.Tag .

Пользовательский компаратор:

 private class SearchCompare : Comparer<ListViewItem>
{
    public override int Compare(ListViewItem x, ListViewItem y)
    {
        if (x?.Tag != null amp;amp; y?.Tag != null)
        {
            return x.Tag.ToString().CompareTo(y.Tag.ToString());
        }
        return 0;
    }
}
 

Инициализация ListView :

 var items = new[]
{
    "1 no",
    "2 yes",
    "3 no",
    "4 yes"
};
foreach (var item in items)
{
    listView1.Items.Add(item);
}
listView1.ListViewItemSorter = new SearchCompare(); // custom sorting
 

И, конечно, текст изменил обработчик событий:

 private void textBox1_TextChanged(object sender, EventArgs e)
{
    string text = textBox1.Text;
    foreach (ListViewItem item in listView1.Items)
    {
        if (item.Text.IndexOf(text, StringComparison.InvariantCultureIgnoreCase) > -1)
        {
            item.Tag = "a"; // a is sorted before b
        }
        else
        {
            item.Tag = "b"; // b is sorted after a
        }
    }
    listView1.Sort();
}
 

Ввод «да» в текстовое поле поиска приведет к сортировке элементов 2 и 4 перед элементами 1 и 3.

Комментарии:

1. Во-первых, спасибо за внимание и ваше время. Это сработало, но я удалил [AllowNull] . потому что приложение не может его определить. Если я это сделаю, вызовет ли это проблемы в будущем? (см. Рис.) ссылка

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