- - PR -
【ASP,VB.NET】コントロール配列とコントロールの動的作成
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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-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ならできますのでその方法で試されてはどうでしょうか?^ー^ | ||||
|
投稿日時: 2003-11-14 14:42
「testButtons(4)」と宣言しながら、「for i = 0 to 4」と使用しているからです。この宣言では“4つ”の領域を持った配列を宣言します。つまり、インデックスが取りうる範囲は“0〜3”です。 その他、コレクションクラスなどが返すLengthプロパティやCountプロパティも、“個数”を返すため、インデックスが取りうる範囲はそれぞれ−1しなければなりませんのご注意。 | ||||
|
投稿日時: 2003-11-14 15:29
今まで同様のコードで落ちたことがなかったので 調べてみました。 そうすると、私も今まで知らなかったのですが、 .NETでは 配列の宣言は要素の数ではなく、添え字の上限値を指定するみたいです [参考] http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-3.asp VBだけかもしれませんが… | ||||
|
投稿日時: 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だとどのような文になるのでしょうか? 持っている書籍で探しているんですが、 探し出せずにいます。 | ||||
|
投稿日時: 2003-11-14 16:21
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-14 17:15
>Jittaさん
ご教授ありがとうございます。 配列の宣言で添え字の上限値を指定するのはVB.NETだけだったんですね まだまだ知識不足で、大変勉強になります。 これからもアドバイス等、よろしくおねがいします |
1