2009-03-03 12 views
0

私はデータベースから情報を引き出すサブルーチンを持っています。このサブルーチンの変数を別のサブルーチンで使用したいのですが。私はすべてを公表しようとしましたが、友好的で共有したくありません。サブルーチンからサブルーチンに変数をどのように共有できますか?

Dim strEmail as String 
Public Sub readDB() 
strEmail = "[email protected]" 
End Sub 

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

readDBはデータベースを読み込んで変数を設定し、何をする必要があれば何でもします。その後、フォームを送信すると、電子メールアドレスが何であってもフォームが電子メールで送信されます。問題の潜水艦への呼び出しのシーケンスが実行可能なことを行う場合

+0

あなたはいくつかのサンプルコードを投稿することができますか? –

+0

@zodeus:vb.netとタグ付けされました –

+0

あなたはどのようにreadDB()を呼び出していますか? –

答えて

3

asp.netページが読み込まれるたびに、グローバル変数が消去されます。これを回避するには、セッション変数を使用します。

その後
Public Sub readDB() 
    Session("strEmail") = "[email protected]" 
End Sub 

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

引数として渡すには、素晴らしいです。文字通り、同じクラス(ASP.Netのコードビハインドページ)の異なるサブシステムに見える変数が必要な場合は、おそらくプライベートメンバー変数が必要です。アクセス修飾子プライベートを持つサブまたは関数の外部に宣言すると、そのクラスのすべてのサブスレッドがアクセスできます。

Private _foo As String 

アンダースコアは、一部の人々が愛し、嫌いな習慣です。あなたはfooというとは明確に異なるようFooのを使用することはできません変数を、公開するプロパティを定義したい場合には、VBで便利ですが、それはまた別の話です。

これは、アプリケーションのコンテキスト全体で変数が表示されるASP.Netの意味で変数グローバル変数で一般的に理解されるものと同じではなく、意図しない結果に向いています。プライベートメンバー変数は、それを所有するクラスだけが見ることができます。

EDIT:最初の回答の後にサンプルコードが追加されました。私のVBは少し錆びですが、あなたがそれを書いたとして、それはsubmitbtn(私が間違っている場合、誰かが私を修正)の内側を含め、クラスレベルの可視性を持つべきであるように、strEmailが見えます。あなたはボタンがクリックされたときにケースされるであろう、ページのロードにポストバックをチェックし、そして唯一の初期ロードではなく、ポストバックにreadDBを呼び出している場合、あなたはをPage_LoadでreadDBを呼び出していることを述べたので、一つの可能​​性は、あります。ポストバックのチェックが含まれていて、それが何であるか分からない例があったかもしれません(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の状態を確認しましたか?

+0

私はそれがセッション内になければまだ消えてしまうと思います。すべてのグローバルがまだ空の場合、submitイベントはpage_loadの前に処理されます。 –

+0

ポストバックイベントは、Loadイベント(http://msdn.microsoft.com/en-us/library/ms178472.aspx)の後に処理されます。 –

+0

すべてのリクエストでロードイベントハンドラでメンバーが初期化され、同じリクエストでページライフサイクルの後半に消費された場合、その値が使用可能になり、セッションに格納する必要はありません。 –

関連する問題