Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150

Поясните по Events

24.11.2021, 15:50. Показов 1184. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс Car
Есть класс Parking как лист для Car
C#
1
2
3
4
5
6
7
8
public class Car
    {
        public string Name { get; set; }
    }
public class Parking : List<Car>
    {
        public string Adress { get; set; }
    }
В событиях не разбираюсь вообще, такой вопрос, есть ли возможность как-либо сделать так, чтобы в созданном экземпляре класса Parking при любом изменении листа Parking (Add\Remove) вызывался какой-либо метод? Т.е. есть экземпляр класса, в него добавился новый объект, и сразу же вызвался метод, допустим, в винформе такой:
C#
1
2
3
4
public void PrintAllCars()
{
parking.ForEach(x => richTextbox.Text += $"Name: {x.Name})
}
Т.е. Лист изменен - метод тригернулся.
Гугл подсказал, что есть такая штука, как ObservableCollection, которая - тот же лист, но имеет что-то связанное с ивентами (в которых не разбираюсь пока что), но она требует <T> коллекцию, тогда как у меня класс сам по себе коллекция. Собсно альтернативный вопрос - есть ли аналог ObservableCollection, который уже является коллекцией?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.11.2021, 15:50
Ответы с готовыми решениями:

Как связать events и single-events (Иерархия шаблонов)?
Здравствуйте. Вопрос в следующем – создал произвольный тип записи &quot;События&quot; (events.php), для каждого поста это категории сделал...

Events
Доброго времени суток. Я вообще к изучению ивентов пока приступать не планировал, делегаты то еще плохо понимаю, но при написании...

Button Events
Подскажите какие события нужны для: Нажатии и удержании кнопки на форме по идее... onkeypress -не работает. при отжатии кнопки на...

20
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
24.11.2021, 16:03
Цитата Сообщение от Pandamonk Посмотреть сообщение
Гугл подсказал, что есть такая штука, как ObservableCollection, которая - тот же лист, но имеет что-то связанное с ивентами (я в них не шарю), но она требует <T> коллекцию, тогда как у меня класс сам по себе коллекция. Собсно альтернативный вопрос - есть ли аналог ObservableCollection который уже является коллекцией?
ObservableCollection изначально создавался конкретно для WPF + MVVM, он вызывает OnPropertyChanged для измененного свойства у объекта коллекции, тем самым уведомляя UI что было изменено свойство у объекта и что нужно обновить некоторую часть на UI. Можно использовать и его по сути, но никто не запрещает вам реализовать внутри класса свой event add/removed и т.д., пример можно взять отсюда:https://stackoverflow.com/ques... list-event
2
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
24.11.2021, 16:53  [ТС]
Спасибо, добавил для Add\Remove, задался вопросом - можно ли сделать это глобальнее, чтобы ивент срабатывал при любом изменении класса-листа, и\или без использования собственных методов Add\Remove? На самом деле, я не знаю, есть ли другие изменения помимо Add\Remove\Clear, и если их больше - могу упустить ивент
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
25.11.2021, 11:07
Цитата Сообщение от Pandamonk Посмотреть сообщение
можно ли сделать это глобальнее
Что вы имеете ввиду под словом глобальный?
Цитата Сообщение от Pandamonk Посмотреть сообщение
На самом деле, я не знаю, есть ли другие изменения помимо Add\Remove\Clear
Вы можете написать по аналогии с add/remove свои event, на любое действие с коллекцией, вплоть до изменения свойства в вашем классе внутри коллекции
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.11.2021, 11:27
Цитата Сообщение от Midian Посмотреть сообщение
он вызывает OnPropertyChanged для измененного свойства у объекта коллекции
ObservableCollection уведомляет только об изменении коллекции (добавление/удаление/перемещение), изменения свойств элементов коллекции он не отслеживает.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
25.11.2021, 12:42
Цитата Сообщение от kolorotur Посмотреть сообщение
ObservableCollection уведомляет только
Вроде, BindingList может извещать об изменении элементов?

Цитата Сообщение от Pandamonk Посмотреть сообщение
есть ли возможность как-либо сделать так, чтобы в созданном экземпляре класса Parking при любом изменении листа Parking (Add\Remove) вызывался какой-либо метод?
Вызывать метод или понимать событие?

Если поднимать событие, то наследуйте от ObservableCollection или BindingList:
C#
1
2
3
4
    public class ParkingsCollection : ObservableCollection<Car>
    {
        public string Adress { get; set; }
    }
Если нужно добавить какой-то свой внутренний метод, то можно наследовать от базового Collection<T> и переопределять методы:
C#
1
2
3
4
5
6
7
8
9
10
11
    public class ParkingsCollection : Collection<Car>
    {
        public string Adress { get; set; }
 
        protected override void InsertItem(int index, Car newCar)
        {
            base.InsertItem(index, newItem);
 
            // Some Code
        }
    }
1
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
25.11.2021, 12:42
Цитата Сообщение от kolorotur Посмотреть сообщение
изменения свойств элементов коллекции он не отслеживает
Данный тип коллекции реализует INotifyPropertyChanged, соответсвенно он отслеживает изменение свойств в коллекции и сообщает UI что нужно обновить запись, если было изменено его свойство посредством Mode=TwoAway связи
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.11.2021, 12:47
Цитата Сообщение от Midian Посмотреть сообщение
Данный тип коллекции реализует INotifyPropertyChanged
Чтобы уведомлять об изменении свойства Count этой же коллекции.

Цитата Сообщение от Midian Посмотреть сообщение
соответсвенно он отслеживает изменение свойств в коллекции и сообщает UI что нужно обновить запись, если было изменено его свойство посредством Mode=TwoAway связи
Изменение свойств самой коллекции, а не свойств ее элементов.
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
25.11.2021, 12:49
Добавлено через 49 секунд
Цитата Сообщение от kolorotur Посмотреть сообщение
Изменение свойств самой коллекции, а не свойств ее элементов.
А это тогда что? Открыв его я вижу вот что внутри:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//
        // Summary:
        //     Raises the System.Collections.ObjectModel.ObservableCollection`1.PropertyChanged
        //     event with the provided arguments.
        //
        // Parameters:
        //   e:
        //     Arguments of the event being raised.
        [__DynamicallyInvokable]
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, e);
            }
        }
1
 Аватар для Andrey-MSK
3349 / 2235 / 388
Регистрация: 14.08.2018
Сообщений: 7,557
Записей в блоге: 4
25.11.2021, 12:50
Цитата Сообщение от Midian Посмотреть сообщение
Данный тип коллекции реализует INotifyPropertyChanged
ObservableCollection<T> Класс
WPF предоставляет ObservableCollection<T> класс, который является встроенной реализацией коллекции данных, реализующей INotifyCollectionChanged интерфейс.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.11.2021, 12:51
Цитата Сообщение от Midian Посмотреть сообщение
А это тогда что?
Запуск события изменения свойства коллекции.
Коллекции, а не ее элементов.
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
25.11.2021, 12:53
Цитата Сообщение от kolorotur Посмотреть сообщение
Запуск события изменения свойства коллекции.
Коллекции, а не ее элементов.
А я по вашему что писал выше? Я же написал, что ObservableCollection внутри себя имплементирует OnPropertyChanged и при изхменении внутри коллекции любого из свойств UI получит уведомление чтобы обновиться
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
25.11.2021, 12:54
Цитата Сообщение от Midian Посмотреть сообщение
Данный тип коллекции реализует INotifyPropertyChanged, соответсвенно он отслеживает изменение свойств в коллекции
У этой коллекции только два мутабельных свойства: Count и Item.
И только об их изменении и сообщает INPC.

Сообщения об изменении вложенных свойств возможно сделать в INPC, но проблема в том, что это не является частью его контракта и, соответственно, потребители коллекции (в том числе привязки) не будут обрабатывать такие сообщения.
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
25.11.2021, 12:56
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У этой коллекции только два мутабельных свойства: Count и Item.
И только об их изменении и сообщает INPC.
Я не это имелл ввиду, ошибся, я хотел сказать что ObservableCollection имплементирует OnPropertyChanged, который оповещает UI что было изменено свойство
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
25.11.2021, 12:58
Цитата Сообщение от Midian Посмотреть сообщение
А я по вашему что писал выше?
Написали расплывчато.
Я тоже это воспринял, как "изменение свойств ЭЛЕМЕНТОВ коллекции".

Добавлено через 51 секунду
Цитата Сообщение от Midian Посмотреть сообщение
Я не это имелл ввиду
Ок - недопонимание.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.11.2021, 13:04
Цитата Сообщение от Midian Посмотреть сообщение
А я по вашему что писал выше?
Перечитал.
При первом прочтении сложилось мнение, что вы говорили об уведомлениях отдельных элементов коллекции.
Если понял неправильно, то виноват — прошу прощения.
0
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
25.11.2021, 14:10
Цитата Сообщение от kolorotur Посмотреть сообщение
При первом прочтении сложилось мнение, что вы говорили об уведомлениях отдельных элементов коллекции.
Если понял неправильно, то виноват — прошу прощения.
Ну бывает, ничего страшного, друг друга просто не поняли
0
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
25.11.2021, 14:23  [ТС]
Цитата Сообщение от Midian Посмотреть сообщение
Что вы имеете ввиду под словом глобальный?
Я имею ввиду, есть ли что-то в C#, что можно было бы выразить в коде как *любое изменение листа*? Конкретно в данном случае я добавлял метод из вашей ссылки (модифицированный Add\Remove), который добавляет\удаляет элемент из коллекции, есть ли способ обойтись без метода?
Если нет, Add\Remove\Clear - есть что-то еще, что повлияет на коллекцию вплане количества элементов для List<T>?
Пока что события кажутся сложны в целом, и не совсем понимаю, где их чаще всего они используются
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
25.11.2021, 15:08
Цитата Сообщение от Pandamonk Посмотреть сообщение
Пока что события кажутся сложны в целом, и не совсем понимаю, где их чаще всего они используются
Объект (экземпляр типа) - это (упрощённо) совокупность его полей, то есть просто участок памяти.
Когда вы изменяете поле (какие-то ячейки памяти), то о том что оно изменилось нет никакой возможности узнать.
Поэтому после изменения, тот кто изменил, должен выполнить сам какие-то действия которые должны быть реакцией на изменение поля.

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

Теперь следующий момент, а как объекту вызвать действия необходимые после изменения поля?
Единственный способ это сделать - это передать объекту ссылку на метод через делегат.
Если по логике использования объекта, может передаваться только один делегат, то часто он называется "Метод обратного вызова" и передаётся в конструкторе экземпляра.
Если же по логике потребители объекта должны иметь возможность после его создания сами подсоединять-отсоединять делегаты, то в объекте должно быть публичное поле с делегатом.

С публичным полем тоже могут быть проблемы из-за того, что оно не инкапсулировано и внешние объекты могут как-то "нелегально" с ним работать.
Допустим, вызвать методы из него, когда по состоянию объекта это делать ненужно или даже нельзя.
Чтобы этого избежать делегат инкапсулируется за событием.
В простейшем случае хватает модификатора event к делегату - остальное компилятор сам сделает.
Через событие имеется возможно только присоединении и отсоединения методов к делегату - операторы += и -=.
Все остальные методы работы с делегатом может использовать только тот тип в котором объявлено событие, в том числе вызвать работу присоединённых методов (это называется поднять событие).
1
 Аватар для roach1967
983 / 463 / 233
Регистрация: 27.06.2014
Сообщений: 1,033
25.11.2021, 20:37
Элд Хасп, а можно сделать так:
Code
1
private string Adress {; }
а все изменения производить через функции ParkingsCollection.GetValue(index_of_item) и ParkingsCollection.SetValue(index_of_item)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2021, 20:37
Помогаю со студенческими работами здесь

Очистка Events
Вообщем такая ошибка получается. myMap.events.add('click', function (e) { toggleActivePlaceMark(); var filter =...

SDL_2 Events
как перехватить события в треде, хочу расспаралелить графику и вычисления. SDL_RenderPresent должен быть вызван в основном треде

Button events
Учу Core MVC и что то вообще не разобрался с кнопочными событиями. Раньше в html файле рисовалась кнопка, а обработка события происходила в...

Mouse events
Как в мазиле правильно обрабатывать события мышки? mousedown mousemove mouseup Создал слайдер, сделал возможность...

Read events
При запускание exe файла foxpro, оно моргает на сек, я знаю что нужно прописать do form form1.scx read events Но я не знаю где...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru