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

时间:2016-11-03 10:33:14

标签: c# vb.net vb.net-to-c#

对不起,如果这是重复的话;我已经广泛搜索了一个基本的解释。

TL; DR - 我已经知道如何连接事件,我的问题涉及支持信息和事件处理程序命名约定,我无法找到答案。已经阅读hereherehereherehere我认为信息过载使我感到困惑,或者我忽略了明显的

我有一个庞大的Web表单(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中创建一个新的Web表单,那么默认代码就是这样:

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

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

  1. 根据最后一个示例,C#用于自动连接事件处理程序的命名约定是什么/在哪里?我很紧张,方法可以运行两次。我发现VS没有为C#创建空事件处理程序的下拉功能。
  2. 如果AutoEventWireUp="False",我是否必须手动连接每一个事件(我希望如此,这是一件好事[我认为......])?

2 个答案:

答案 0 :(得分:3)

subscribe为真时,将查找以下方法:

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

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

答案 1 :(得分:1)

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

像这样

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

但是很久以前我正在使用Web Forms,所以也许我忘记了一些事情,但这与我在常规C#应用程序中的表现类似。