VB to C# - автоматическое именование обработчиков событий и явное подключение
Извините, если это дубликат; Я много искал объяснения.
TL; DR - я уже знаю, как подключать события, мой вопрос касается поддержки информации и соглашения об именах обработчиков событий, на которые я не могу найти ответ. Уже прочитав здесь, здесь, здесь, здесь и здесь, я думаю, информационная перегрузка сбила меня с толку, или я упускаю из виду очевидное.
У меня есть огромное решение для веб-форм (VB), которое необходимо конвертировать в C#, начиная с некоторых проектов Web Forms Server Control. В каждом VB использует Handles
слово для подключения обработчиков событий:
Public Class Accordion
Inherits CompositeControl
Private Sub Accordion_Init(sender As Object, e As System.EventArgs) Handles Me.Init
End Sub
Private Sub AccordionPanelHolder_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
Private Sub AccordionPanelHolder_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
End Sub
End Class
При использовании любого вида преобразователя кода, и из моего исследования, подход C# означает ручное подключение обработчиков событий (код сокращен для краткости):
public Accordion()
{
PreRender += AccordionPanelHolder_PreRender;
Load += AccordionPanelHolder_Load;
Init += Accordion_Init;
}
private void AccordionPanelHolder_PreRender(object sender, System.EventArgs e)
{
// ...
}
Я доволен вышесказанным, однако, если я создаю новую веб-форму в VS, то код по умолчанию просто так:
public partial class TestPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// to do
}
}
На странице нет логики обработчика событий. я вижу это AutoEventWireUp="True"
когда обычно я бы это False
, Поэтому мои вопросы:
- Что / Где определено соглашение об именах, которое C# использует для автоматического подключения обработчиков событий, как в последнем примере? Я нервничаю, что методы могут работать дважды. Я вижу, что VS не имеет функции раскрывающегося списка для C# для создания пустых обработчиков событий, которые подключены.
- Если
AutoEventWireUp="False"
Должен ли я вручную подключать каждое событие (я ожидаю, что это хорошо [я думаю...])?
2 ответа
Когда AutoEventWireUp
Это правда, будут искать следующие методы:
- Page_PreInit
- Page_Init
- Page_InitComplete
- Page_PreLoad
- Page_Load
- Page_LoadComplete
- Page_DataBind
- Page_SaveStateComplete
- Page_PreRender
- Page_PreRenderComplete
- Page_Unload
- Page_Error
- Page_AbortTransaction
- Page_CommitTransaction
Итак, методы должны использовать это точное имя.
Если вы установите AutoEventWireUp
в false, вы должны будете добавить обработчик для любого из этих событий вручную.
Вы можете посмотреть здесь для получения дополнительной информации.
Не совсем уверен, что это правильный ответ, но вы должны думать о нем как о событии, когда оно необходимо. Если это от создания вашего класса, вы можете добавить хуки в конструкторе или как в asp.net делегат Page_Load.
Что-то вроде этого
void Page_Load(object sender, EventArgs e)
{
PreRender += AccordionPanelHolder_PreRender;
Load += AccordionPanelHolder_Load;
Init += Accordion_Init;
}
Но давным-давно я работал с веб-формами, так что, возможно, я кое-что забыл, но это похоже на то, как я делал бы это в обычном приложении на C#.