VB 到 C# - 事件处理程序的自动命名与显式连接

VB to C# - auto naming of event handlers vs explicit wiring

抱歉,如果这是重复的;我广泛搜索了基本解释。

TL;DR - 我已经知道如何连接事件,我的问题与支持信息和事件处理程序命名约定有关,我找不到答案.已经阅读 here, here, here, here, and here 我认为信息过多让我感到困惑,或者我忽略了显而易见的事情。

我有一个庞大的 Web 表单 (VB) 解决方案需要转换为 C#,从一些 Web 表单服务器控件项目开始。在每个中,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 中创建一个新的 Web 表单,那么默认代码就是这样:

public partial class TestPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // to do
    }
}

页面中没有事件逻辑处理程序逻辑。我看到 AutoEventWireUp="True",而通常我会将其设为 False。因此我的问题是:

  1. What/Where 是按照上一个示例定义的 C# 用于自动连接事件处理程序的命名约定吗?我很紧张方法可以 运行 两次。我看到 VS 没有 C# 的下拉功能来创建空的事件处理程序。
  2. 如果 AutoEventWireUp="False",我是否必须手动连接每个事件(我希望如此,这是一件好事 [我认为...])?

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,您将必须手动添加任何此类事件的处理程序。

您可以查看here了解更多信息。

不完全确定这是否是正确答案,但您应该将其视为在需要时连接事件。 如果这是从您的 class 创建而来,您可以在构造函数中添加挂钩,或者像 asp.net 中那样 Page_Load 委托。

类似这样

void Page_Load(object sender, EventArgs e)
{
    PreRender += AccordionPanelHolder_PreRender;
    Load += AccordionPanelHolder_Load;
    Init += Accordion_Init;
}

但很久以前我就在使用 Web 窗体,所以也许我忘记了一些东西,但这与我在常规 C# 应用程序中的做法类似。