Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
28 / 28 / 5
Регистрация: 24.03.2013
Сообщений: 238
.NET 4.x

ObservableCollection привязана к DataGrid, как реализовать поиск и удаление в коллекции?

27.06.2014, 00:09. Показов 2295. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ObservableCollection<class> привязана к DataGrid, как реализовать поиск, сравнение и удаление в коллекции? Если возможно - без использования Linq;

XAML

C#
1
2
3
4
5
6
<DataGrid Name="DataGrid1" AutoGenerateColumns="False" Margin="10,26,0,11" Background="White" HorizontalAlignment="Left" Width="212">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Компьютер"  Width="100" Binding="{Binding DG_ComputerName, Mode = TwoWay}"/>
                    <DataGridTextColumn Header="IP" Width="100" Binding="{Binding DG_IP, Mode = TwoWay}"/>
                </DataGrid.Columns>
            </DataGrid>
C#

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 public class DataGridSource : INotifyPropertyChanged
    {
        // Хандлер
        public event PropertyChangedEventHandler PropertyChanged;
    
        // Имя компьютера
        private string _DG_ComputerName;
        public string DG_ComputerName
        {
            get
            {
                return this._DG_ComputerName;
            }
            set
            {
                this._DG_ComputerName = value;
                NotifyPropertyChanged();
            }
        }
    
        // IP адрес компьютера
        private string _DG_IP;
        public string DG_IP
        {
            get
            {
                return this._DG_IP;
            }
            set
            {
                this._DG_IP = value;
                NotifyPropertyChanged();
            }
        }
    
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
MainWindow (добавляем данные в DataGrid)

C#
1
2
3
4
5
 private void CollectionStart()
            {
                // Заносим данные в DataGrid
                collection.Add(new DataGridSource() { DG_ComputerName = "test", DG_IP = "test" });
            }
Добавлено через 16 минут
Update

Для поиска в коллекции использовал foreach, не знаю насколько это правильно, поправьте если этого делать не стоит.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
bool sep = false;
 
    // Проверяем, есть ли значение в коллекции DataGrid
    foreach (var i in collection)
    {
        if (i != null)
        {
            if (i.DG_ComputerName.Contains("serq") != true && i.DG_IP.Contains("127.0.0.1") != true)
            {
                MessageBox.Show("Нет в коллекции");
                sep = true;
            }
            else
            {
                MessageBox.Show("Есть в коллекции");
            }
        }
        else
        {
            MessageBox.Show("NULL");
        }
    }
 
    if (sep)
    {
        // Заносим данные в DataGrid
        collection.Add(new DataGridSource() { DG_ComputerName = "serq", DG_IP = "127.0.0.1" });
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.06.2014, 00:09
Ответы с готовыми решениями:

Как написать запрос поиска в коллекции ObservableCollection
Подскажите как написать запрос поиска в коллекции ObservableCollection Текст к 2х textbox'ах сравниваютя с полями объектов Этот запрос...

Как привязать DataGrid к ObservableCollection
Есть модель клиента,МодельПросмотра,если можно так перевести,которая реализует ObservableObject. Главное окно привязано к View,который...

Как заполнить DataGrid элементами ObservableCollection или List
Есть класс, содержащий строку и List ссылок на другой, состоящий из чисел(А и В). Мне необходимо вывести эти данные: имя - А1 - В1 ...

2
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
27.06.2014, 01:19
Цитата Сообщение от z668 Посмотреть сообщение
Для поиска в коллекции использовал foreach, не знаю насколько это правильно, поправьте если этого делать не стоит.
С чего не стоит?

Я делал так:
2 коллекции List<T> и ObservableCollection<T> во ViewModel классе редактора (логика окна редактирования), к примеру, автомобилей. Сначала заполняются обе коллекции. Потом, при изменении одного из свойств фильтра (свойство привязанное к строке поиска) очищается ObservableCollection<T> и снова заполняется по отфильтрованным данным из List<T>, который в свою очередь всегда содержит полный список лишь для заполнения ObservableCollection<T> , которая уже отображает данные, если строка поиска пуста, то просто выводит все данные из List<T>.

Примерно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public string SearchText
        {
            get { return _searchText; }
            set
            {
                IsReadOnlyMode = !string.IsNullOrWhiteSpace(value);
                _searchText = value;
 
                RootElements.Clear();
 
                var res = ElementsList.FindAll(car => car.CarNumber.IndexOf(_searchText,
                    StringComparison.InvariantCultureIgnoreCase) > -1);
                foreach (CarViewModel client in res)
                {
                    RootElements.Add(client);
                }
 
                RaisePropertyChanged("SearchText");
            }
        }
Добавлено через 1 минуту
ElementsList - List<T>
RootElements - ObservableCollection<T>

Добавлено через 3 минуты
C#
1
2
 var res = ElementsList.FindAll(car => car.CarNumber.IndexOf(_searchText,
                    StringComparison.InvariantCultureIgnoreCase) > -1);
Пройтись по всем элементам коллекции (как в foreach) и на каждой итерации цикла вернуть true или false. В данном случае мы проходимся по коллекции машин, на каждой итерации мы имеем доступ к текущему элементу car, где и сравниваем что-то и возвращаем удовлетворяет ли условию эта итерация цикла, если да, то этот элемент (car) помещаем в результирую коллекцию res.

Добавлено через 2 минуты
Если свойств фильтров несколько, то можно вызывать при изменении любого из свойств один и тот же метод, который фильтрует сразу по всем свойствам.

Добавлено через 2 минуты
Вот удаление и копирование
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
        public RelayCommand<CarViewModel> RemoveRowItemCommand
        {
            get
            {
                return _removeRowItemCommand ?? (_removeRowItemCommand = new RelayCommand<CarViewModel>(
                    element =>
                    {
                        //чтобы новый добавленный автомобиль после его же удаления нельзя было попытаться 
                        //удалить из базы данных. так как его там изначально и не было
                        if (!element.IsNew)
                        {
                            elementsForRemoving.Add(element);
                        }
                        if (RootElements.Contains(element))
                        {
                            RootElements.Remove(element);
                        }
                        ElementsList.Remove(element);
                        RecountSelectedIndex();
                    }));
            }
        }
 
        public RelayCommand<CarViewModel> CopyRowItemCommand
        {
            get
            {
                return _copyRowItemCommand ?? (_copyRowItemCommand = new RelayCommand<CarViewModel>(
                    element =>
                    {
                        var newElement = CloneIfNotNullOrCreateNewRootElement(element);
                        ElementsList.Add(newElement);
                        RootElements.Add(newElement);
                    }));
            }
        }
 
        public override CarViewModel CloneIfNotNullOrCreateNewRootElement(CarViewModel element)
        {
            CarViewModel newCar;
            if (element == null)
            {
                var client = new Car();
                newCar = new CarViewModel(client);
            }
            else
            {
                newCar = element.Clone();
            }
 
            newCar.Id = Constants.NewItemId;
            newCar.WasEditedWithoutSaving = false;
            newCar.StartListenPropertyChanging();
 
            return newCar;
        }
Добавлено через 5 минут
Вообще тут такие заморочки в коде, особенно видны при копировании IsNew и при клонировании объекта либо создании нового. Так как нужно было такое поведение: Загрузили список из базы данных, в окне редактируем, если хоть одно свойство изменилось, то в DataGrid слева самый первый столбец отображает красный квадратик, если не редактировались, то стандартный фоновый цвет DataGrid. Удаляем, добавляем элементы. А после нажатия ОК из базы удаляются только те данные, которые изначально в ней были, а те, что мы создали вручную в редакторе, все они имеют свойстов IsNew == true и поэтому даже нет попытки удалить их из базы, да и все они имеют Id == -1, что и есть признак IsNew. А обновляем данные в базе данных только те, у которых хоть одно свойстов было изменено.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
        public void UpdateDatabase()
        {
            var forUpdating =
                ElementsList.Where(recipe => !recipe.IsEmpty && !recipe.IsNew && recipe.WasEditedWithoutSaving)
                    .ToArray();
            var newElements = ElementsList.Where(recipe => !recipe.IsEmpty && recipe.IsNew).ToArray();
            var forRemoving = elementsForRemoving; //чтобы не забыть
 
            Debug.WriteLine("Машин для обновления {0}", forUpdating.Length);
            Debug.WriteLine("Машин для добавления {0}", newElements.Length);
            Debug.WriteLine("Машин для удаления {0}", forRemoving.Count);
 
            if (newElements.Length > 0)
            {
                Int32ArrayDbQueryResult res1 =
                    DataManager.Instance.UpdateCars(newElements.Select(r => r.Car));
                if (res1.Result != DbOperationResult.Success)
                    Debug.Fail(string.Format("Добавление Машин не удалось\r\n{0}\r\nDbOperationResult:{1}",
                        res1.Error, res1.Result));
                else if (res1.Result == DbOperationResult.Success)
                {
                    for (int i = 0; i < newElements.Length; i++)
                    {
                        newElements[i].Id = res1.Data[i];
                        newElements[i].WasEditedWithoutSaving = false;
                    }
                }
            }
 
            if (forRemoving.Count > 0)
            {
                ObjectDbQueryResult res2 =
                    DataManager.Instance.RemoveCars(forRemoving.Select(eVm => eVm.Car));
                if (res2.Result != DbOperationResult.Success)
                    Debug.Fail(string.Format("Удаление Машин не удалось\r\n{0}\r\nDbOperationResult:{1}", res2.Error,
                        res2.Result));
                else
                    elementsForRemoving.Clear();
            }
 
            if (forUpdating.Length > 0)
            {
                Int32ArrayDbQueryResult res3 =
                    DataManager.Instance.UpdateCars(forUpdating.Select(r => r.Car));
                if (res3.Result != DbOperationResult.Success)
                    Debug.Fail(string.Format("Обновление Машин не удалось\r\n{0}\r\nDbOperationResult:{1}",
                        res3.Error, res3.Result));
                else
                {
                    foreach (CarViewModel recipeVm in forUpdating)
                        recipeVm.WasEditedWithoutSaving = false;
                }
            }
        }
1
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
27.06.2014, 09:00
Сходу возникает вопрос, отчего не воспользоваться готовым ListCollectionView?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2014, 09:00
Помогаю со студенческими работами здесь

Как отсортировать ObservableCollection при сортировки DataGrid WPF по полю
Здравствуйте, уважаемые форумчане! Помогите, пожалуйста, с проблемой. Есть DataGrid WPF &lt;DataGrid...

Происходит добавление значения из textbox в datagrid, которая привязана к базе данных, в чем ошибка?
При нажатии на кнопку происходит добавление значения из textbox в datagrid, которая привязана к базе данных, в чем ошибка ? Мне по...

ObservableCollection: проверка значений коллекции
Аха, есть неккая коллекция, содержащая в себе логин и пароль, var findAColl = ClientColl.Where(itemAf =&gt; (itemAf.Name ==...

Подскажите, как реализовать - удаление и поиск в базе данных?
Нужна Ваша помощь. На форме dbGrid,BitBtn(создать,удалить,Править) Принцип вносишь данные в базу данных, А при удалении должно удалять...

Коллекции с привязкой к ListBox и перенос элементов в ObservableCollection
Осуществить метод, при помощи которого мы можем переносить в конец списка первые элементы коллекции «ObservableCollection».


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru