|
|
@@ -4,11 +4,11 @@
|
|
|
|
|
|
# Поиск, сортировка
|
|
|
|
|
|
-В этой теме мы познакомимся еще с двумя визуальными элементами: **TextBox** (ввод строки для поиска) и **RadioButton** (сортировка по одному полю)
|
|
|
+В этой теме мы познакомимся ещё с двумя визуальными элементами: **TextBox** (ввод строки для поиска) и **RadioButton** (сортировка по одному полю)
|
|
|
|
|
|
## Поиск
|
|
|
|
|
|
-1. В разметке окна (в элемент WrapPanel) добавляем элемент для ввода теста - TextBox
|
|
|
+1. В разметке окна (в элемент **WrapPanel**) добавляем элемент для ввода теста - **TextBox**
|
|
|
|
|
|
```xml
|
|
|
<Label
|
|
|
@@ -21,6 +21,8 @@
|
|
|
KeyUp="SearchFilter_KeyUp"/>
|
|
|
```
|
|
|
|
|
|
+ Не забываем реализовать (`^ + пробел`) обработчик события _KeyUp_ (этот обработчик срабатывает при отпускании клавиши)
|
|
|
+
|
|
|
1. В коде окна создаем переменную для хранения строки поиска и запоминаем её в обработчике ввода текста (SearchFilter_KeyUp)
|
|
|
|
|
|
```cs
|
|
|
@@ -33,7 +35,7 @@
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-1. Дорабатываем геттер списка кошек, чтобы после фильтра по возрасту срабатывал ещё и фильтр по кличке
|
|
|
+1. Дорабатываем геттер списка кошек, чтобы после фильтра срабатывал ещё и поиск по кличке
|
|
|
|
|
|
```cs
|
|
|
get
|
|
|
@@ -41,12 +43,15 @@
|
|
|
// сохраняем во временную переменную полный список
|
|
|
var res = _catList;
|
|
|
|
|
|
- // фильтруем по возрасту
|
|
|
- res = res.Where(c=>(c.Age>=selectedAge.ageFrom && c.Age<selectedAge.ageTo));
|
|
|
+ // фильтруем (тут только один вариант, у вас может быть несколько)
|
|
|
+ res = res.Where(c => (
|
|
|
+ c.age >= selectedAge.ageFrom &&
|
|
|
+ c.age < selectedAge.ageTo
|
|
|
+ ));
|
|
|
|
|
|
- // если фильтр не пустой, то ищем ВХОЖДЕНИЕ подстроки поиска в кличке без учета регистра
|
|
|
- if(SearchFilter != "")
|
|
|
- res = res.Where(c => c.Name.IndexOf(
|
|
|
+ // если строка поиска не пуста, то ищем ВХОЖДЕНИЕ подстроки поиска в кличке без учета регистра
|
|
|
+ if(searchFilter != "")
|
|
|
+ res = res.Where(c => c.name.IndexOf(
|
|
|
searchFilter,
|
|
|
StringComparison.OrdinalIgnoreCase) >= 0);
|
|
|
|
|
|
@@ -54,13 +59,15 @@
|
|
|
}
|
|
|
```
|
|
|
|
|
|
+ Метод **IndexOf** возвращает позицию подстроки в строке или `-1`, если подстрока не найдена. В доке есть метод **Contains**, но он доступен только с версии .NET 9
|
|
|
+
|
|
|
## Сортировка
|
|
|
|
|
|
>Мы, в рамках знакомства с визуальными элементами, будем использовать радио-кнопки, но, если вариантов сортировки более одного, то лучше использовать тот-же выпадающий список
|
|
|
|
|
|
Мы будем сортировать по возрасту
|
|
|
|
|
|
-Выбранный вариант будем определять по атрибуту **Tag**. Этот атрибут есть у всех элементов и его тип **объект**.
|
|
|
+Выбранный вариант будем определять по атрибуту **Tag**. Этот атрибут есть у всех визуальных элементов и его тип **объект**.
|
|
|
|
|
|
1. В разметке добавляем радиокнопки
|
|
|
|
|
|
@@ -103,8 +110,8 @@
|
|
|
|
|
|
```cs
|
|
|
...
|
|
|
- if (sortAsc) res = res.OrderBy(c=>c.Age);
|
|
|
- else res = res.OrderByDescending(c => c.Age);
|
|
|
+ if (sortAsc) res = res.OrderBy(c => c.age);
|
|
|
+ else res = res.OrderByDescending(c => c.age);
|
|
|
|
|
|
return res;
|
|
|
```
|