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

解決


三毛猫  2008-12-11 23:59:20  No: 141043

'引数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-12 00:05:45  No: 141044

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


YuO  2008-12-12 01:25:29  No: 141045

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


三毛猫  2008-12-12 07:22:09  No: 141046

ミスがありました。
    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-12 07:27:41  No: 141047

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-12 07:43:37  No: 141048

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

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


三毛猫  2008-12-12 07:56:43  No: 141049

>とおりすがりさん

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


  2008-12-12 09:29:11  No: 141050

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


Teel  2008-12-12 11:08:02  No: 141051

新しいプロジェクトで

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 18:28:44  No: 141052

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

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

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


三毛猫  2008-12-12 20:30:17  No: 141053

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

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

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


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加