'引数indexに番号を受け取って、その番号が付いたTxtichitasenコントロールを返す
Private Function Txtichitasen(ByVal index As Integer) As TextBox
Return DirectCast(Me.Controls("Ichitasen" & index.ToString), TextBox)
End Function
Private Sub NumericUpDown3_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown3.ValueChanged
If NumericUpDown1.Value = 1 Then
For i = 1 To 10
Txtichitasen(i * 10 + 1).Visible = True
Txtichitasen(i * 10 + 2).Visible = False
Txtichitasen(i * 10 + 3).Visible = False
Txtichitasen(i * 10 + 4).Visible = False
Txtichitasen(i * 10 + 5).Visible = False
Txtichitasen(i * 10 + 6).Visible = False
Txtichitasen(i * 10 + 7).Visible = False
Txtichitasen(i * 10 + 8).Visible = False
Next i
以上のように関数を使用してコントロール配列(みたいなの)を実現したいのですが、エラー(NullReferenceExceptionはハンドルされませんでした。)が出てうまくいきません。何がおかしいのでしょうか?
If NumericUpDown1.Value = 1 then
ではなく
If NumericUpDown3.Value = 1 then
でした。
・例外が発生した行はどの行ですか
また,For - Nextのなかであるならば,
・その時のiの値はいくつですか
・その時のiと加算する値に対応するコントロールはちゃんと存在していますか?
ミスがありました。
Private Function Txtichitasen(ByVal index As Integer) As TextBox
Return DirectCast(Me.Controls("Ichitasen" & index.ToString), TextBox)
End Function
のIchitasenはTxtichitasenでした。
しかし、修正してもやはり同じです。
例外が発生したのは
For - Nextの中の一行目の
Txtichitasen(i * 10 + 1).Visible = True
です。
そのときのiの値は1です。
対応するコントロールは存在しています。
Txtichitasen(i * 10 + 1).Visible = True
を
Txtichitasen(11).Visible = Trueとしてもエラーになり、
Txtichitasen11.Visible = Trueとすると通るので、
Private Function Txtichitasen(ByVal index As Integer) As TextBox
Return DirectCast(Me.Controls("Txtichitasen" & index.ToString), TextBox)
End Function
ここがおかしいのだろうと思いますが、どこがおかしいのかわかりません。
よろしくお願いいたします。
http://dobon.net/vb/dotnet/control/buttonarray.html
↑DOBON.NET 動的にコントロールの配列を作成する
>とおりすがりさん
コントロールの配列を作成したいわけではなくて、
連続した数字をつけてあるコントロールをループ文で一括処理したいです。
該当の記述を見つけられませんでした。
ループ処理したいコントロールを全部配列なりListなりにぶち込んじゃえば?
編集 削除新しいプロジェクトで
Textbox Ichitasen11からIchitasen18 まで8個
NumericUpDown3 をひとつ
作って実行したらエラーも出ずにVisible設定はうまく動作している。
だから
>ここがおかしいのだろうと思いますが、・・・
ということはない。
'引数indexに番号を受け取って、その番号が付いたTxtichitasenコントロールを返す
Private Function Txtichitasen(ByVal index As Integer) As TextBox
Return DirectCast(Me.Controls("Ichitasen" & index.ToString), TextBox)
End Function
Private Sub NumericUpDown3_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NumericUpDown3.ValueChanged
Dim i As Integer = 1
If NumericUpDown3.Value = 1 Then
For i = 1 To 1 '0 <--8個しか作ってないのでループはなし
Txtichitasen(i * 10 + 1).Visible = True
Txtichitasen(i * 10 + 2).Visible = False
Txtichitasen(i * 10 + 3).Visible = False
Txtichitasen(i * 10 + 4).Visible = False
Txtichitasen(i * 10 + 5).Visible = False
Txtichitasen(i * 10 + 6).Visible = False
Txtichitasen(i * 10 + 7).Visible = False
Txtichitasen(i * 10 + 8).Visible = False
Next i
End If
End Sub
しかし、80個(以上?)のTextboxを使うこと自体が常識はずれだな。
以下の点を確認してみてください。
(1) Me.Controls は、Me の直下にあるコントロールしか管理していません。
たとえば、GroupBox や Panel 等の下に配置されているコントロールは、
Panel1.Controls にて管理されます。再帰的に検索するために
.Controls.Find の利用を検討してみてください。
(2) コントロールには、他と重複する名前を付ける事が可能です(無名も可)。
Visual Studio のデザイナから生成した場合は、そのような状況には
なりませんが、プログラムコードで生成している場合は注意してください。
>Teelさん、魔界の仮面弁士さん
ありがとうございます。
確かに、新しいプロジェクト単純にしてやってみたら動きました。
魔界の仮面弁士さんの(1)の状況でした。
textboxをtabcontrolの中に入れていたのが原因でした。
本当にありがとうございました。