2009-09-10 268 views
0

我有一个关于连线Web服务器控件的问题。从我见过的许多例子中,事件处理程序已经用私有访问修饰符声明。我试图这样做,如下所示:ASP.net Web服务器控件

<asp:Label runat="server" ID="lblMessage" Font-Names="Verdana" Text="Hello" /> 
     <br /> 
    <asp:Button runat="server" ID="btnSubmit" text="click me!" onClick="btnSubmit_Click" /> 

和代码隐藏文件:

private void btnSubmit_Click(object sender, EventArgs e) 
    { 
     lblMessage.Text = "Goodbye"; 
    } 

但是,编译器无法找到单击处理程序,除非我改变访问受保护的。

按钮事件处理程序是否应该是私有的,如果是的话,为什么它在我的实例中不起作用?

此外,除了使用onClick属性,还有其他方法将事件处理程序连接到在.aspx文件中声明创建的控件?

由于提前, 勇

回答

4

什么可能是这里困惑的是,很多人直观地设计自己的网页表单。当他们想要将点击处理程序连接到按钮服务器控件时,他们通常会双击该按钮或在Visual Studio中选择它,按F4转到其属性并在该窗口中设置它的事件。这些方法都有以下效果:

  1. 在类后面的代码中创建私有处理程序。它的名字是[control name] _ [event]。在你的情况下,这是btnSubmit_Click。

  2. 同样在代码隐藏文件中,每个Web服务器控件都有一个对应的受保护的代码。在Init甚至,新创建的处理程序通过以下代码与服务器控件上的Click事件关联:

    btnSubmit.Click + = btnSubmit_Click;

通过这种方法,处理程序仍然可以是私有的。当你尝试在ASPX文件本身中设置处理程序时,你遇到问题的地方在哪里。在这种情况下,你将有更新的事件处理程序是非私有的,因为你已经指出的,或定义ASPX页面本身如下:

<script language="C#" runat="server"> 
    public void btnSubmit_Click(object sender, EventArgs e) 
    { 
    .. 
    } 
</script> 

私有方法/属性的代码隐藏类对ASPX页面不可见。

+0

感谢David,我想这种强调visual studio的自动处理这么多编码过程的能力的一个缺点,它掩盖了实际发生的事情和很多时间,并且你失去了更深入的理解。很好的解释。 – yogibear 2009-09-10 05:12:05

+0

专用处理程序行为仅适用于Visual Studio 2003,2005+将其写入ASPX文件并创建受保护的方法AFAIK。 – 2009-09-10 05:28:18

+0

@Wyatt:很高兴知道。 – 2009-09-10 05:38:22

1

事件处理程序需要为protected。原因是ASP.NET实际上会生成一个新的类,它继承自您在代码隐藏中定义的类,而不是使用类本身。

作为替代方案,你可以写:

btnSubmit.Click += new EventHandler(btnSubmit_Click); 

在Page_Load处理程序,但我不会推荐它。在VB.NET中,我相信你也可以使用关键字Handles,但它在C#中不可用。