- PR -

【ASP,VB.NET】コントロール配列とコントロールの動的作成

1
投稿者投稿内容
脳みそきんに君
会議室デビュー日: 2003/11/14
投稿数: 2
投稿日時: 2003-11-14 13:51
こんにちは。いつも参考にさせて頂いております。

わからないところが出てきまして、みなさまのお力をお貸してください!
よろしくお願いします。

ASP.NETでButtonコントロールを配列にして、
for文で、画面にButtonを追加して行きたいのです。

VB.NETのサイトを参考にして、
頑張ってみたのですが、私のスキル不足でできませんでした。

できる方がいらっしゃいましたら、
教えていただければと思います。

よろしくお願い致します。

参考になるかどうかわかりませんが、
下記の書いたのが私のコードです。

この場合だとMe.Controls.Add(testButtons(i))で、
インデックスが配列の境界外です。 というエラーがでます。

---------------------------------------------------------------
Friend testButtons(4) As System.Web.UI.WebControls.Button

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer

'ボタンコントロールのインスタンス作成し、プロパティを設定する
For i = 0 To 4
'インスタンス作成
testButtons(i) = New System.Web.UI.WebControls.Button()
'プロパティ設定
testButtons(i).Text = i.ToString()
'testButtons(i).Width = New width(30, 30)
'testButtons(i).Location = New Point(i * 30, 10)
'イベントハンドラに関連付け
AddHandler testButtons(i).Click, AddressOf Me.testButtons_Click

Next

'フォームにコントロールを追加
Me.Controls.Add(testButtons(i))


End Sub

Private Sub testButtons_Click(ByVal sender As System.Object, ByVal e As EventArgs)
'クリックされたボタンを表示する
MsgBox(sender.Text)
End Sub

---------------------------------------------------------------
モモ
会議室デビュー日: 2003/11/07
投稿数: 11
投稿日時: 2003-11-14 14:13
こんにちは。

インデックスが配列の境界外なのは、
フォームにコントロールを追加するタイミングが間違っているせいではないでしょうか?

あと、動的に生成する場合はフォームの中に…

************************************************************

Friend testButtons(4) As System.Web.UI.WebControls.Button

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer

'ボタンコントロールのインスタンス作成し、プロパティを設定する
For i = 0 To 4
'インスタンス作成
testButtons(i) = New System.Web.UI.WebControls.Button()
'プロパティ設定
testButtons(i).Text = i.ToString()
'testButtons(i).Width = New width(30, 30)
'testButtons(i).Location = New Point(i * 30, 10)
'イベントハンドラに関連付け
AddHandler testButtons(i).Click, AddressOf Me.testButtons_Click

'フォームにコントロールを追加
Me.FindControl("Form1").Controls.Add(testButtons(i))

Next

End Sub

************************************************************

因みに、MsgBoxはWebでは使えなかったような……
JavaScriptならできますのでその方法で試されてはどうでしょうか?^ー^
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-14 14:42
引用:

脳みそきんに君さんの書き込み (2003-11-14 13:51) より:

この場合だとMe.Controls.Add(testButtons(i))で、
インデックスが配列の境界外です。 というエラーがでます。

---------------------------------------------------------------
Friend testButtons(4) As System.Web.UI.WebControls.Button


'ボタンコントロールのインスタンス作成し、プロパティを設定する
For i = 0 To 4



 「testButtons(4)」と宣言しながら、「for i = 0 to 4」と使用しているからです。この宣言では“4つ”の領域を持った配列を宣言します。つまり、インデックスが取りうる範囲は“0〜3”です。

 その他、コレクションクラスなどが返すLengthプロパティやCountプロパティも、“個数”を返すため、インデックスが取りうる範囲はそれぞれ−1しなければなりませんのご注意。
モモ
会議室デビュー日: 2003/11/07
投稿数: 11
投稿日時: 2003-11-14 15:29
引用:

Jittaさんの書き込み (2003-11-14 14:42) より:

 この宣言では“4つ”の領域を持った配列を宣言します。つまり、インデックスが取りうる範囲は“0〜3”です。

 その他、コレクションクラスなどが返すLengthプロパティやCountプロパティも、“個数”を返すため、インデックスが取りうる範囲はそれぞれ−1しなければなりませんのご注意。




今まで同様のコードで落ちたことがなかったので
調べてみました。

そうすると、私も今まで知らなかったのですが、
.NETでは 配列の宣言は要素の数ではなく、添え字の上限値を指定するみたいです

[参考]
http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-3.asp

VBだけかもしれませんが…
脳みそきんに君
会議室デビュー日: 2003/11/14
投稿数: 2
投稿日時: 2003-11-14 15:55
モモさん、Jittaさん、ありがとうございます。


アドバイスの通りに、
修正してみたらできました!

************************************
Friend testButtons(10) As System.Web.UI.WebControls.LinkButton
※()の中は上限数の数値だったんですね・・・。>モモさん

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer

'ボタンコントロールのインスタンス作成し、プロパティを設定する
For i = 0 To 9
'インスタンス作成
testButtons(i) = New System.Web.UI.WebControls.LinkButton()

'プロパティ設定
testButtons(i).Text = i.ToString()

'イベントハンドラに関連付け
AddHandler testButtons(i).Click, AddressOf Me.testButtons_Click

'フォームにコントロールを追加
Me.FindControl("Form1").Controls.Add(testButtons(i))

Next

End Sub

Private Sub testButtons_Click(ByVal sender As System.Object, ByVal e As EventArgs)
'クリックされたボタンを表示する

End Sub
************************************


ありがとうございます!
これで仕事が進みますよ〜。。。感謝!!


”教えて君”になって大変申し訳ないんですが、
最後にもう一つ教えてください。


FOR文を10回まわすことにして、
5回目で、改行したい場合は、

ASPだと、

If i = 4 Then
Response.Write("<BR>")
End If

とかだと思いますが、
ASP.NETだとどのような文になるのでしょうか?

持っている書籍で探しているんですが、
探し出せずにいます。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-14 16:21
引用:

モモさんの書き込み (2003-11-14 15:29) より:

今まで同様のコードで落ちたことがなかったので調べてみました。

そうすると、私も今まで知らなかったのですが、
.NETでは 配列の宣言は要素の数ではなく、添え字の上限値を指定するみたいです


 C#やC++、おそらくJ#も、配列の宣言は要素の数です。そして、配列のインデックスは0から始まります←要注意。そのため、使用時に使えるインデックスは、(宣言に記入した数−1)になります。
要素数   :1 2 3 4 5
インデックス:0 1 2 3 4

 VB6.0以前は、「Option Base {0 | 1}」で、配列の基数を0か1か、宣言できました。0にすると(宣言に記入した数−1)まで、1にすると(宣言に記入した数)まで使えます。そして、デフォルトは1でした。このため、array(5)と宣言すると、array(1)〜array(5)まで使えました。VB.NETでは、0に固定されています。
(β1は0固定、β2は選べる、製品版は0固定・・・と遷移したような?)



>脳みそきんに君さん

>FOR文を10回まわすことにして、
>5回目で、改行したい場合は、

 一般的に、
if (i + 1) % n = 0 then
で判断します(100回ループで、5回ごとに・・・としたら、i = 5 or i = 10と書きますか?)。+1するかどうかは、iが0からはじまるか、1から始まるかで決まります。

 ASP.NETでも、<br>を埋め込むことに変わりはありません。ラベルなどの改行したい文字列に足し込んでやります。

 ところで、ASPはわからないのですが、ResponseオブジェクトはページのRenderメソッドでページの内容が入れられます。それ以前にResponse.Writeすると、ファイルの先頭、HTML要素の外側に出力されることになります。
モモ
会議室デビュー日: 2003/11/07
投稿数: 11
投稿日時: 2003-11-14 17:15
>Jittaさん

ご教授ありがとうございます。
配列の宣言で添え字の上限値を指定するのはVB.NETだけだったんですね


まだまだ知識不足で、大変勉強になります。
これからもアドバイス等、よろしくおねがいします
1

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