C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: VB2008でのstatic変数の初期化


(過去ログ 115 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■68003 / inTopicNo.1)  VB2008でのstatic変数の初期化
  
□投稿者/ ほうらいし (1回)-(2013/09/15(Sun) 04:04:15)

分類:[.NET 全般] 

VisualStudio2008 asp.net vbを使用しています。
C言語では関数内にあるstatic変数の初期化処理は1度だけしか実行されませんが、VBでは何度も実行される仕様なのでしょうか?

やりたいことはユーザーがテキストボックスのテキストを変更したら、入力値のチェックを行い、不正なら今日の日付にし、正しければ入力値のまま表示するということで、
webフォームアプリを作成して以下のようにコードを書いています。
ページにテキストボックスを配置し、AutoPostBackをTRUEに設定して、テキストボックスがフォーカスを失ったらTextChangedイベントを発生させ、入力チェック(日付かどうか)を行っています。
テキストボックスのtextプロパティにはアプリが起動時の1回だけ今日の年月日を表示しています。
起動後はポストバックでPage_Loadが呼ばれてもテキストボックスの表示を変えたくないので、初期化処理が走らない様、
static変数を使用して起動後2回目以降のPage_Loadを除外しているつもりです。
しかし、ユーーザーが正しい値(年月日)でテキストを変更しても、static変数の初期化処理が毎回実行され今日の年月日が表示され続けてしまいます。
初期化処理が毎回走らないようにするにはどうすればよいでしょうか?
よろしくお願いします。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'起動時1回だけ初期化する為のフラグ
Static initstate As Boolean

'1回目なら今日の年月日でテキストボックスのテキストを初期化する
If initstate Then
Dim todaytext As String = DateValue(Now)
TextBox1.Text = todaytext
initstate = False
End If
End Sub


Protected Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.TextChanged
'DateTimeに変換できるか確かめる()
Dim dt As Date

If Date.TryParse(TextBox1.Text, dt) Then

Else
'変換出来なかったら今日の日付に戻す
Dim todaytext As String = DateValue(Now)
TextBox1.Text = todaytext
End If

End Sub


引用返信 編集キー/
■68004 / inTopicNo.2)  Re[1]: VB2008でのstatic変数の初期化
□投稿者/ もりお (13回)-(2013/09/15(Sun) 08:26:32)
2013/09/15(Sun) 08:26:43 編集(投稿者)
No68003 (ほうらいし さん) に返信

Static変数はStatic変数を含むメソッドがSharedでなければインスタンスごとに確保されるものです。
Page_LoadメソッドはSharedではありませんので、Static変数initstateはインスタンスごとに確保されます。

Page_Loadが呼ばれてinitstateに値が設定され、次にPage_Loadが呼ばれたときにPageのインスタンスが
以前のものと同じであるならinitstateの値は以前に設定された値になります。しかし、Pageのインスタンスは
Page_Loadが呼ばれるたびに違うものだったりします。なので、Page_Loadが呼ばれるたびにinitstateは
初期化されます。

最初のPage_Loadのときだけ処理を行うということであればPage.IsPostBackプロパティで判断するのがよいと思います。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        ...
    End If
End Sub

引用返信 編集キー/
■68007 / inTopicNo.3)  Re[2]: VB2008でのstatic変数の初期化
□投稿者/ ほうらいし (2回)-(2013/09/15(Sun) 10:58:03)
> 最初のPage_Loadのときだけ処理を行うということであればPage.IsPostBackプロパティで判断するのがよいと思います。

上記の通りやると思い通りに動かすことが出来ました。
丁寧な説明やコード指導まで書いて下さり感謝です。
甘んじず自分でももっと勉強します。
もりおさん、ありがとうございました!

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -