如何将子程序中的变量共享到子程序?

时间:2009-03-03 20:22:38

标签: asp.net vb.net

我有一个子例程,我从数据库中提取信息。我想在另一个子例程中使用这个子例程中的变量。我尝试将所有内容公之于众,但它并不想要友好和分享。

Dim strEmail as String
Public Sub readDB()
strEmail = "whatever@doohikcy.com"
End Sub

Public Sub submit_btn(ByVal sender As Object, ByVal e As EventArgs)
Response.Write(strEmail)
End Sub

readDB将读取数据库并设置变量并执行它需要做的任何事情。然后当他们提交表格时,它会通过电子邮件将表格发送到电子邮件地址。

2 个答案:

答案 0 :(得分:3)

每次加载asp.net页面时,全局变量都会被清除。您可以使用会话变量来避免这种情况。

Public Sub readDB()
   Session("strEmail") = "whatever@doohikcy.com"
End Sub

然后:

Public Sub submit_btn(ByVal sender As Object, ByVal e As EventArgs)
    Response.Write(CStr(Session("strEmail")))
End Sub

答案 1 :(得分:1)

将它们作为参数传递是很好的,如果对所讨论的潜艇的调用顺序使其可行。如果您确实需要一个对同一个类中的不同子类可见的变量(ASP.Net中的代码隐藏页面),那么您正在寻找的可能是私有成员变量。使用访问修饰符 Private 在任何子或函数之外声明它,并且类中的所有子函数都可以访问它。

Private _foo As String

下划线是有些人喜欢的惯例,有些人讨厌。如果你想定义一个属性来公开变量,那么它在VB中就派上用场了,你不能将 Foo foo 区别开来,但这是另一个故事。

这与ASP.Net意义上的术语 Global 变量通常所理解的不同,其中变量在整个应用程序上下文中都是可见的,这会导致意想不到的后果至少。私有成员变量仅对拥有它的类可见。

编辑:我的初始答案后添加了您的示例代码。我的VB有点生疏,但正如你所写的那样, strEmail 看起来应该具有类级别的可见性,包括 submitbtn (有人纠正我,如果我'我错了)。一种可能性,因为你提到你在 Page_Load 中调用readDB,如果你在页面加载中检查回发,并且只在初始加载时调用readDB,而不是在回发时调用readDB,那将是这种情况单击按钮时。您可能已经看过一些示例,其中包括对Postback的检查,并且没有意识到它的作用(我只是建议,因为您提到您是ASP.Net的新手,如果您是新手,它并不直观 - 没有打算进攻)。

Protected Sub Page_Load (sender as object, e as EventArgs)
    If Not IsPostback
        // this doesn't get called when the button is clicked so
        // strEmail would not be populated when submitbtn is invoked
        readDB
    End If
End Sub

尽管如此,这是一个猜测,所以它可能远离基地。您是否在Page_Load,readDB和submitbtn中设置了断点以查看每个中的strEmail状态?