- PR -

ASP.NETでグローバル変数

1
投稿者投稿内容
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 2003-05-12 19:52
こんにちはASP.NETを本日から勉強し始めました。

Dim p_A(10) As ArrayList
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim i As Integer
For i = 1 To 10
p_A(i) = New ArrayList()
p_A(i).Add("AAA")
p_A(i).Add("BBB")
Next
End sub

Private Sub list1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles list1.SelectedIndexChanged
Me.Text1.text = p_A(1).Text
End Sub

Private Sub list2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles list2.SelectedIndexChanged
Me.Text1.text = p_A(2)
End Sub

としてデバッグするとLoadイベントを抜けるとp_A()がNothingとなってしまいます。
ASP.NETではフォーム内で使用するグロバール変数はどこで定義すればよいのでしょうか?
そもそもグローバル変数を使う以外でもっと一般的なやり方がWEBの世界ではあるのでしょうか?
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2003-05-13 09:49
こんにちは!

ASP.NETを勉強し始めて2ヶ月足らずですが、私も最初に
ブチ当った壁がこのグローバル変数でした。

一般的なやり方かどうか分りませんが、私は下記のようにしました。

Shared 変数A As 属性…@
Friend Shared 変数B As 属性…A

@のように定義すると定義したWEBフォーム内でのみ有効な共通変数として使用でき、
Aのように定義すると複数のWEBフォーム間で使用できます。

FormA内部でAのように定義した変数BをFormBで参照する場合には
FormB.変数Bという具合に明示的に記述して使っています。

複数のWEBフォーム間の共通変数の定義の仕方が他にもあれば
私もご教示願いたいです。
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2003-05-13 09:52
やっちまいました!
事故レスです。^^;

<誤>
FormA内部でAのように定義した変数BをFormBで参照する場合には
FormB.変数Bという具合に明示的に記述して使っています。



<正>
FormA内部でAのように定義した変数BをFormBで参照する場合には
FormA.変数Bという具合に明示的に記述して使っています。

です。
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 2003-05-13 10:47
moondog様返答ありがとうございます。
ほんとだ。。dimで定義してた共通変数をSharedに書き換えただけで動作してしまいました。
すごい。。
昨日から関連の情報調べてみたのですが、
ViewStateを使うのが一般的なのかなと思いました。
値を代入する側で
viewstate("viw_p_A") = p_A
保存した内容を取り出す時にオブジェクトをキャストして
Dim arrvalb As New ArrayList(CType(viewstate("viw_p_A"), ArrayList))
とやったのですが、このキャストでエラーとなってしまいました。
大変そうだな。。と思ってた矢先にコメントがあったので非常に助かりました。
ありがとうございました。(でも何になったんエラーなんだろうな。。)

>複数のWEBフォーム間の共通変数の定義の仕方が他にもあれば
>私もご教示願いたいです。

この手の情報少ないです。。私も知りたいです!
ぼると
常連さん
会議室デビュー日: 2003/04/09
投稿数: 42
投稿日時: 2003-05-13 12:51
引用:

viewstate("viw_p_A") = p_A
保存した内容を取り出す時にオブジェクトをキャストして
Dim arrvalb As New ArrayList(CType(viewstate("viw_p_A"), ArrayList))
とやったのですが、このキャストでエラーとなってしまいました。


ArrayListに引数にArrayListをとるコンストラクタが存在しないからです。
これをやるなら
Dim arrvalb As ArrayList = CType(viewstate("viw_p_A"), ArrayList)
でしょう。
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 2003-05-13 16:14
なると様ありがとうございます。
なるほど。。言われてみると納得します。
ありがとうございました。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2003-05-13 16:49
引用:

moondogさんの書き込み (2003-05-13 09:49) より:

複数のWEBフォーム間の共通変数の定義の仕方が他にもあれば
私もご教示願いたいです。


複数のWebフォーム間で同一のデータを利用したい場合は
アプリケーションオブジェクトやセッションオブジェクトを
利用するのが基本です。
共通変数の挙動について十分に理解して利用しているのなら
いいのですが、一般的にははまる原因になるかと思います。

#アクセスしてるユーザがちがっても同じ値が使われちゃうし。
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2003-05-13 21:05
===>shu様

こんにちは!

>#アクセスしてるユーザがちがっても同じ値が使われちゃうし。
ドキッ!

ということは、複数ユーザが同時に同じフォーム開いてたり
すると、変数の値の整合性が崩れたりするんでしょうか?

今作ってるアプリもセッション変数への置き換えを考えた方が
よさそうな予感…^^;
1

スキルアップ/キャリアアップ(JOB@IT)