6

Here is the issue:

I have a simple ASP.NET form with 2 buttons.

One of them is created by dragging the button from the tools and the other I created directly in HTML:

<body>
<form id="Form1" method="post" runat="server">
    <asp:Button OnClick="ABC" Runat="server" Text="rrr" id="Button1"></asp:Button>
    <asp:Button  id="Button2" runat="server" Text="Button"></asp:Button>
</form>
</body>

Button2 is created using tools and has the following Event Handler:

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim s As String = ""
 End Sub

This "Private Event handler runs without any problem.

However for the button which is created under HTML , we have the following event handler:

Private Sub ABC(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim a As Integer = 0

End Sub

For this one I get the following complile error:

Compiler Error Message: BC30390: 'WebApplication9.WebForm1.Private Sub ABC(sender As Object, e As System.EventArgs)' is not accessible in this context because it is 'Private'.

If I change the event handler scope from Private to protected this will work. Question is why private works for one event handler but not the other one.

4

1 回答 1

10

基本上,一个aspx 页面被实现为两个类。其中一个类包含您在代码 ( .aspx.vb) 后面的代码(并且,根据您使用的 ASP.Net 的版本/模型,还有一些设计器生成的代码 ( .aspx.designer.vb))。

第二个类是在页面第一次被请求(或站点被预编译)时创建的,它包含来自.aspx页面的任何内联代码和由 ASP.Net 生成的其他代码,并且包括例如用 . 声明的任何控件的代码runat="server"

第二个类继承自第一个类。

因此,如果第一个类负责连接其事件处理程序,它使用Handles子句*:

Private Sub ABC(...) Handles Button1.Click

Button1属于这个类,因为它是由设计器生成的代码放在那里的。一切都是此类本地的,因此该方法可以是Private.

如果第二个类负责连接事件处理程序,它通过使用服务器控件上的属性来完成,例如这里:

<asp:Button OnClick="ABC" Runat="server"

现在,除非ABC是在.aspx文件内内联声明的方法,否则它必须来自第一个类(或第一个本身继承自的任何类)

我们现在有一种情况,第二类中的代码想要引用第一类中的代码。因此,.NET 的规则说它试图访问的成员不能是Private.


正如您在问题中所提出的那样,您不应该拥有的是两个类都负责连接(相同的)事件处理程序。


*它不必使用子句——它也可以在事件内部或任何其他合适的地方Handles设置事件处理程序。是 VB 页面上静态控件的惯用语。在 C# 中,没有等价于,因此事件处理程序与 C# 的等价物 ,挂钩。AddHandlerPage_LoadHandlesHandlesAddHandler+=

于 2013-06-14T13:12:59.110 回答