gpt4 book ai didi

asp.net - 为什么私有(private)事件处理程序在 ASP.NET 中不起作用

转载 作者:行者123 更新时间:2023-12-04 14:14:23 26 4
gpt4 key购买 nike

这是问题:

我有一个带有 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>

Button2 是使用工具创建的,并具有以下事件处理程序:
 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim s As String = ""
End Sub

这个“私有(private)事件处理程序运行没有任何问题。

但是对于在 HTML 下创建的按钮,我们有以下事件处理程序:
Private Sub ABC(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim a As Integer = 0

End Sub

对于这个我得到以下编译错误:
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'.

如果我将事件处理程序范围从 Private 更改为 protected,这将起作用。问题是为什么 private 对一个事件处理程序有效,而对另一个事件处理程序无效。

最佳答案

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

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

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

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

Private Sub ABC(...) Handles Button1.Click
Button1属于这个类,因为它是由设计器生成的代码放在那里的。对这个类来说,一切都是本地的,所以方法可以是 Private .

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

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

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

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

*它不必使用 Handles子句 - 它还可以使用 AddHandler 设置事件处理程序里面例如 Page_Load事件,或任何其他合适的地方。 Handles是 VB 页面上静态控件的惯用语。在 C# 中,没有等价于 Handles ,因此事件处理程序与 C# 中的 AddHandler 等效, += .

关于asp.net - 为什么私有(private)事件处理程序在 ASP.NET 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17108762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com