对不起,如果这是重复的话;我已经广泛搜索了一个基本的解释。
TL; DR - 我已经知道如何连接事件,我的问题涉及支持信息和事件处理程序命名约定,我无法找到答案。已经阅读here,here,here,here和here我认为信息过载使我感到困惑,或者我忽略了明显的
我有一个庞大的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
。我的问题是:
AutoEventWireUp="False"
,我是否必须手动连接每一个事件(我希望如此,这是一件好事[我认为......])?答案 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#应用程序中的表现类似。