请原谅我根据论坛的规则做错了,但我不知道该怎么做。这是对下面链接中问题的修改。有一个回答接近答案,但不完全是。通过“评论”或“编辑”来解释太多了,所以我想我应该做一个新的帖子。
How to Share Code Between Pages and Classes
无论如何(修改)的问题。
我试图在多个代码隐藏页面和多个类之间共享代码,这些类使用Page类的对象和方法。简单的例子是使用“response”和“session”对象。然而,在我的真实的例子中,我将使用其他Page对象和方法(例如GridView、Panels等)。
我想将公共页面对象相关代码保存在多个共享类中,并在多个页面和类之间共享代码。
下面的例子是基于我之前的Albert的建议(几乎成功了......归功于他)。
当使用下面的代码时,我在尝试从 “Class1”调用“Class2_Procedure” 时收到错误“Object reference not set to an instance of an object”(对象引用未设置为对象的示例)。
第页示例。调用“Class1_Procedure”和“Class2_Procedure”有效。调用“Class1_Procedure_Calling_Class2_Procedure”无效。
Partial Class _default
Inherits System.Web.UI.Page
Dim MyClass1 As New Class1(Me)
Dim MyClass2 As New Class2(Me)
Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
Response.Write("Default Page > Page_Load</br>")
MyClass1.Class1_Procedure()
MyClass2.Class2_Procedure()
MyClass1.Class1_Procedure_Calling_Class2_Procedure()
End Sub
End Class
类1。问题是当您从 *“Class1”调用 *“Class2_Procedure”时。
Public Class Class1
Dim MyPage As Page
Sub New(MePage As Page)
MyPage = MePage
End Sub
Dim MyClass2 As New Class2(MyPage)
Sub Class1_Procedure()
MyPage.Response.Write("Class1 > Class1_Procedure</br>")
End Sub
Sub Class1_Procedure_Calling_Class2_Procedure()
MyPage.Response.Write("Class1 > Class1_Procedure_Calling_Class2_Procedure</br>")
MyClass2.Class2_Procedure()
End Sub
End Class
类2。“Class2_Procedure”可以从主页调用,但问题是当您从 “Class1”调用“Class2_Procedure” 时。
Public Class Class2
Dim MyPage As Page
Sub New(MePage As Page)
MyPage = MePage
End Sub
Sub Class2_Procedure()
MyPage.Response.Write("Class2 > Class2_Procedure</br>")
End Sub
End Class
2条答案
按热度按时间kgsdhlau1#
你的问题是这个代码:
首先,你可能希望所有的全局作用域变量都在同一个地方(在顶部)。
第二个问题是,当您创建Class 1的示例时,公共变量将在那个时间点初始化。
因此,在“new”事件中,所有这些值都默认为它们的值-但是MyPage THEN在new事件中被设置。(这对于公共Class 2获取mypage来说似乎太晚了。(如果您将其转换为getter/setter,我认为它会这样工作。)
因此,如果你想在该类中“设置”一些公共成员(变量),你应该在new事件中这样做--特别是在你创建的类依赖于其他公共值的情况下(如果你使用“new”,你不能控制顺序)。
在class 1中对任何public remember使用new关键字在99%的情况下都是可以的,不是问题。
然而,当那个/那些变量(在这个例子中是一个类示例)也使用其他成员/变量时,你在这里没有太多的控制权。
因此,强制执行该问题,并确保MyPage是“肯定”设置,然后您就可以放心地创建class 2的新示例,这也需要Mypage引用。
所以,你需要这样写:
换句话说,“new”关键字看起来是在Class 2拾取我的页面之前触发的。(或者更好地说,“can”拾取MyPage)
lvmkulzt2#
你必须首先在一个模块中创建代码或函数,然后,以你正在使用的形式导入模块或类,通常是windowsapplication.classname。