2017-08-17 38 views
0

我想了解(由于单纯的好奇心),当一个事件处理方法在.NET.Net何时分配事件处理程序方法来控制事件?

被分配到该事件在这个例子中,假设我们有一个ASP网页表单,WebForm1的一个按钮,Button1的。默认情况下,当我们向页面添加一个按钮时,.NET/VS允许我们定义一个在WebForm1类中单击按钮时运行的方法。我有兴趣知道它在幕后做了什么。

我知道这是事件和委托我的这里发生了什么如下理解的事:

当我们创建的ASP项目的新Web窗体,.NET声明它作为一个新的类,从页面类继承;

public partial class WebForm1 : System.Web.UI.Page 
{ 
} 

我可以添加一个按钮,页面和.NET创建按钮对象的实例(虽然,在设计文件)

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected Button Button1; 
} 

我可以声明运行按钮时的方法被点击

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected Button Button1; 
    protected void Button1_Click(object sender, EventArgs e) 
    { 
     Debug.WriteLine("Button clicked"); 
    } 
} 

那么背后发生了什么事情让我得到这个功能开箱即用?

System命名空间定义了一个EventHandler,它是一个委托;

public delegate void EventHandler(object sender, EventArgs e); 

按钮类有此委托

public event EventHandler Click; 

某处 Button1_Click的方法被分配在Button1的

到Click事件

这将是沿着

东西线的一个实例
Button1.Click += Button1_Click; 

我的问题是,这发生在哪里?

这是发生在WebForm1类中的东西吗?

编辑

正如其他人所说,有一些标记,我忘了提如下:

<asp:Button ID="Button1" runat="server" Text="Button" /> 

此外,由mybirthname和This Resource提到的,这是我自从发现,如果我决定改变

AutoEventWireup="true" 

AutoEventWireup="false" 

有一些地方我可以自己做这个任务。

.NET/VS会在哪里做这个事情,AutoEventWireUp是真的,它似乎没有在项目的任何地方生成任何代码?

+0

通常情况下(至少在WinForms和Xaml中),这发生在函数InitializeComponent中。由于这是一个部分类,请尝试寻找另一个.cs文件,如'* .design.cs',可以存储这些东西。 – CShark

+0

你的标记是什么样的?你有没有像''? – CodeCaster

+1

了解ASP.NET与WinForms和其他桌面平台完全不同。由于网络应用程序的不连贯性,Web应用程序必须使用巧妙的技巧来假装他们正在以事件驱动的方式工作。如果您有兴趣了解那些肮脏的细节,请阅读关于后期支持的信息。 – dotNET

回答

0

你可以在Page_Load事件中做到这一点。

protected void Page_Load(object sender, EventArgs e) 
{ 

    Button1.Click += Button1_Click; 
} 

但你目前的代码将无法工作。目前您只有一个按钮,不会在页面的Controls中添加。

您必须在ASPX为:

<asp:Button runat="server" ID="Button1" /> 

此外,您可以在这里OnClick事件

<asp:Button runat="server" ID="Button1" OnClick="Button1_Click" /> 

如果你想在代码中添加按钮控制后面的适当位置是要加在CreateChildControls()方法中

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected Button button1=null; 
    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 
     button1 = new Button(); 
     button1.ID="Button1"; 
     button1.OnClick += Button1_Click; 
     this.Controls.Add(button1); 
    } 

} 

这样会加上对接如果你想把它作为后台代码中的控件,那么你可以在页面上进行操作。但是,当你有aspx并且你可以写出按钮的正确位置时,这种方法不是很好的方法。这将在所有其他控件下呈现该按钮。您创建自定义控件时使用此方法。

相关问题