#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. Это пользовательские аннотации для целей профилирования кода, я их даже больше не замечаю. Я отредактировал вопрос и также удалил их.