コントロール配列(みたい)なのを実現するには。

解決


三毛猫  2008-12-11 14:59:20  No: 141043  IP: 192.*.*.*

'引数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はハンドルされませんでした。)が出てうまくいきません。何がおかしいのでしょうか?

編集 削除
三毛猫  2008-12-11 15:05:45  No: 141044  IP: 192.*.*.*

If NumericUpDown1.Value = 1 then
ではなく
   If NumericUpDown3.Value = 1 then
でした。

編集 削除
YuO  2008-12-11 16:25:29  No: 141045  IP: 192.*.*.*

・例外が発生した行はどの行ですか
また,For - Nextのなかであるならば,
・その時のiの値はいくつですか
・その時のiと加算する値に対応するコントロールはちゃんと存在していますか?

編集 削除
三毛猫  2008-12-11 22:22:09  No: 141046  IP: 192.*.*.*

ミスがありました。
    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です。
対応するコントロールは存在しています。

編集 削除
三毛猫  2008-12-11 22:27:41  No: 141047  IP: 192.*.*.*

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

ここがおかしいのだろうと思いますが、どこがおかしいのかわかりません。
よろしくお願いいたします。

編集 削除
とおりすがり  2008-12-11 22:43:37  No: 141048  IP: 192.*.*.*

http://dobon.net/vb/dotnet/control/buttonarray.html

↑DOBON.NET  動的にコントロールの配列を作成する

編集 削除
三毛猫  2008-12-11 22:56:43  No: 141049  IP: 192.*.*.*

>とおりすがりさん

コントロールの配列を作成したいわけではなくて、
連続した数字をつけてあるコントロールをループ文で一括処理したいです。
該当の記述を見つけられませんでした。

編集 削除
 2008-12-12 00:29:11  No: 141050  IP: 192.*.*.*

ループ処理したいコントロールを全部配列なりListなりにぶち込んじゃえば?

編集 削除
Teel  2008-12-12 02:08:02  No: 141051  IP: 192.*.*.*

新しいプロジェクトで

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を使うこと自体が常識はずれだな。

編集 削除
魔界の仮面弁士  2008-12-12 09:28:44  No: 141052  IP: 192.*.*.*

以下の点を確認してみてください。

(1) Me.Controls は、Me の直下にあるコントロールしか管理していません。
  たとえば、GroupBox や Panel 等の下に配置されているコントロールは、
  Panel1.Controls にて管理されます。再帰的に検索するために
  .Controls.Find の利用を検討してみてください。

(2) コントロールには、他と重複する名前を付ける事が可能です(無名も可)。
  Visual Studio のデザイナから生成した場合は、そのような状況には
  なりませんが、プログラムコードで生成している場合は注意してください。

編集 削除
三毛猫  2008-12-12 11:30:17  No: 141053  IP: 192.*.*.*

>Teelさん、魔界の仮面弁士さん
ありがとうございます。
確かに、新しいプロジェクト単純にしてやってみたら動きました。

魔界の仮面弁士さんの(1)の状況でした。
textboxをtabcontrolの中に入れていたのが原因でした。

本当にありがとうございました。

編集 削除