这是问题:
我有一个带有2个按钮的简单ASP.NET表单.
其中一个是通过拖动工具中的按钮创建的,另一个是我直接在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>
Run Code Online (Sandbox Code Playgroud)
Button2是使用工具创建的,具有以下事件处理程序:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim s As String = ""
End Sub
Run Code Online (Sandbox Code Playgroud)
这个"私有事件处理程序运行没有任何问题.
但是对于在HTML下创建的按钮,我们有以下事件处理程序:
Private Sub ABC(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a As Integer = 0
End Sub
Run Code Online (Sandbox Code Playgroud)
对于这个我得到以下complile错误:
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'.
Run Code Online (Sandbox Code Playgroud)
如果我将事件处理程序范围从Private更改为protected,则这将起作用.问题是私有为一个事件处理程序而不是另一个事件处理程序.
基本上,aspx页面实现为两个类.其中一个类包含代码(.aspx.vb)后面的代码(并且,根据您使用的ASP.Net的版本/型号,还有一些设计器生成的代码(.aspx.designer.vb)).
第一个类是在第一次请求页面时(或者网站是预编译的)创建的,并且包含来自.aspx页面的任何内联代码和ASP.Net生成的其他代码,并且包括例如用于声明的任何控件的代码runat="server".
第二类继承自第一类.
因此,如果第一个类负责连接其事件处理程序,它使用一个Handles子句*:
Private Sub ABC(...) Handles Button1.Click
Run Code Online (Sandbox Code Playgroud)
Button1属于这个类,因为它是由设计器生成的代码放在那里的.一切都是这个类的本地,所以方法可以Private.
如果第二个类负责连接事件处理程序,它通过使用服务器控件上的属性来完成它,例如:
<asp:Button OnClick="ABC" Runat="server"
Run Code Online (Sandbox Code Playgroud)
现在,除非ABC是内声明内联的方法.aspx文件,它必须是从第一类(或从其中的任何类第一本身从继承)
我们现在遇到第二类中的代码想要引用第一类中的代码的情况.因此,.NET的规则说它试图访问的成员不可能Private.
正如你在问题中所做的那样,你不应该拥有的是两个班级负责连接(相同)事件处理程序.
*它不具有使用Handles条款-它也可以设置事件处理程序使用AddHandler中如Page_Load事件,或其他任何地方这是适当的.Handles对于VB中页面上的静态控件来说,这是惯用的.在C#中,没有相应的东西Handles,因此事件处理程序与C#相当AddHandler,+=.