Где зарегистрироваться для событий C#?

Я в настоящее время перехожу от VB до C# и имею некоторые проблемы относительно регистрации моего интереса к событию.

При использовании VB это был просто случай определения что метод Handles и событие, часто это было сгенерировано при помощи объектного списка событий. В то время как я могу легко использовать Class.event += delegate в C# я не уверен, куда лучшее место должно поместить код, чтобы сделать это.

Я лучше всего помещаю его в InitializeComponent() согласно сгенерированному коду (говорят, выбираете ли Вы событие в от разработчика), или если я помещаю его в конструкторе для лучшей удобочитаемости/обслуживания. Если в конструкторе, должен он быть прежде или после вызова к InitializeComponent()?

5
задан themaninthesuitcase 15 March 2010 в 15:05
поделиться

8 ответов

Когда вы занимаетесь разработкой WinForm (судя по упомянутой функции InitializeComponent ()), обычно вы назначаете обработчик с помощью Visual Studio. Вы просматриваете свойства своего элемента управления, щелкаете значок молнии, чтобы получить список всех событий, находите свое событие и либо дважды щелкаете по нему (для создания нового обработчика), либо выбираете существующий обработчик из списка. Visual Studio добавит проводку этого в сгенерированный код, поэтому вам не нужно об этом беспокоиться.

5
ответ дан 13 December 2019 в 05:33
поделиться

2 способа сделать это. Вы можете либо создать свой собственный метод, который вы вызываете в своем конструкторе, который, в свою очередь, создает обработчик событий, либо вы можете просто поместить их в свой конструктор. Вероятно, хорошая идея - удалить обработчики событий из кода финализатора / деструктора.

0
ответ дан 13 December 2019 в 05:33
поделиться

Если у вас есть метод InitializeComponent () , вы используете конструктор, поэтому вы можете связывать события прямо в конструкторе, если хотите . Для этого щелкните значок молнии в окне свойств, и вы увидите список всех событий для выбранного объекта. Вы можете просто ввести там название события, и он создаст для вас код.

Если вы не являетесь поклонником дизайнера, свяжите их после вызова InitializeComponent и убедитесь, что вы отсоединили их, когда закончите (в Dispose () ).

0
ответ дан 13 December 2019 в 05:33
поделиться

Я всегда создаю частный метод под названием Init() и помещаю его туда, а затем вызываю этот метод из конструктора или обработчика события Form_Load. Это семантически лучше, IMO, чем делать это в самом конструкторе. И вы не хотите размещать его внутри InitializeComponent(), потому что в следующий раз, когда вы измените что-то в конструкторе, он, скорее всего, удалит весь добавленный вручную код.

3
ответ дан 13 December 2019 в 05:33
поделиться

Не не вручную добавляйте код в метод InitializeComponent () . Этот метод генерируется кодом, поэтому, как только вы измените форму, любая логика, которую вы добавили вручную в этот метод, будет уничтожена.

Я обычно добавляю метод для обработки события формы Load и помещаю туда свои регистрации событий.

1
ответ дан 13 December 2019 в 05:33
поделиться

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

Бывают случаи, когда вы подключаетесь к событиям динамически / условно в других местах, например, в ответ на какое-то другое событие.

0
ответ дан 13 December 2019 в 05:33
поделиться

Иногда дизайнер Visual Studio может испортить код, поэтому добавление обработчиков событий в InitializeComponent может создать головную боль, лучше сделать это примерно так

public Form1(){
   InitializeComponent();
   WireUpEvents();
}

public void WireUpEvents(){
   this.fooEvent += new EventHandler(foo_handler);
   .... etc ....
}

И убедитесь, что вы удалили обработчики событий в функции Dispose формы....

public void UnWireEvents(){
   this.fooEvent -= new EventHandler(foo_handler);
   .... etc ....
}

По мере разработки формы Visual Studio будет изменять код в методе InitializeComponent(), расположенном в form.design.cs, поэтому крайне важно, чтобы вы не редактировали этот код вручную...

2
ответ дан 13 December 2019 в 05:33
поделиться

Это зависит, но большая часть время, да.

Используйте InitializeComponent, если вы хотите, чтобы событие было перехвачено на протяжении всей формы (я предполагаю, что вы говорите о Forms / UserControls / и т. Д.). В других случаях вам понадобится более детальный контроль над обработкой события.

Имейте в виду, что вы захотите отцепить все эти события (используя синтаксис - =), когда вы удаляете форму или больше не хотите обрабатывать событие. Сохранение прикрепленных делегатов обработчика событий - одна из наиболее распространенных утечек управляемой памяти.

1
ответ дан 13 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: