コントロール名の選択

タグの編集
投稿者 まだまだ  (中学生) 投稿日時 2009/6/10 03:03:26
こんにちは
VB2008を使っています。

ある変数「Number」があります。
そしてフォームの上にはボタンが10個あります。
ボタンの名前はそれぞれbtn1,btn2,…,btn10となっています。
で、もうひとつのボタンbtnClickを押すと、Numberの中に入っている変数の数に応じて、10個のボタンのうち1つのボタンのテキストが変わるものを作りたいです。

'btn2のテキストを変わるようにする 
Dim Number As Byte = 2

Private Sub btnClick_Click(…
   Dim ControlName As String = "btn" & Str(Number)
   ControlName.Text = "選択"
End Sub


こんな感じなのを作りたいのです。
でも上のではうまくいきません。(いかないのはわかっているけれど…)
どうすれば動くのでしょうか?
ご教授願います。
投稿者 まだまだ  (中学生) 投稿日時 2009/6/10 03:11:39
すいません
何かの拍子にいいサイトが開いて解決しました。
ごめんなさい。
同じことで困っている人がいるかもしれないので、URLを掲載しておきます。
http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/Q_22640204.html
投稿者 まだまだ  (中学生) 投稿日時 2009/6/10 05:11:02
何度もすみません
あの方法ではPictureBoxでは通用しませんでした。

Dim strPic As String = "PictureBox1"
Me.Controls(strPic).Image = Nothing


これができるような方法はないでしょうか?
ご教授願います。
投稿者 daive  (社会人) 投稿日時 2009/6/10 06:05:57
Option Strict On  '必要がない限りON がいいかと
Option Explicit On '必要がない限りON がいいかと

Public Class xxxxx


中略



        For i = 1 To 5
            If IsNothing(Me.Controls("PictureBox" & i.ToString("0"))) = False Then
                If System.IO.File.Exists(FILE_JATextBox.Text) Then
                    CType(Me.Controls("PictureBox" & i.ToString("0")), PictureBox).Image = Image.FromFile(FILE_JATextBox.Text)     'JA
                Else
                    CType(Me.Controls("PictureBox" & i.ToString("0")), PictureBox).Image = Nothing
                End If
            End If
        Next




中略




        Dim strDmmy As String
        Dim Ret As DialogResult


        With Me.OpenFileDialog1
            .Title = "画像ファイルの選択"
            .Filter = "画像 ファイル (*.bmp)|*.bmp|ピクチャ (*.jpg;*.ico)|*.jpg;*.ico|全て  (*.*)|*.*"
            .FilterIndex = 1
            .DefaultExt = "bmp"
            .InitialDirectory = PrmPath
            .FileName = ""

        End With
        Ret = Me.OpenFileDialog1.ShowDialog
        If Ret = Windows.Forms.DialogResult.OK Then
            strDmmy = Me.OpenFileDialog1.FileName
            Label10.Text = strDmmy
            '
            CType(PrmImg, PictureBox).Image = Image.FromFile(strDmmy) '表示中のデータを更新
            CType(PrmTXT, TextBox).Text = strDmmy
            '
        Else
            'エラー処理
        End If


中略


        Dim Btt As Button

        Btt = CType(sender, Button)
        '
        GB_OkNg.Tag = Btt.Tag
        GB_OkNg.Top = Btt.Top + Btt.Height
        GB_OkNg.Left = Btt.Left
        GB_OkNg.Visible = True


’こんな感じでいかがでしょうか?
投稿者 mitchin  (社会人) 投稿日時 2009/6/10 06:15:38
ControlCollection.Itemプロパティは Control 型なので Image プロパティはありません。
PictureBox にキャストする必要があります。

DirectCast(Me.Controls.Item("PictureBox1"), PictureBox).Image = Nothing


この場合、PictureBox1 はフォーム直下に配置されていないと見つからず、例外が発生します。
Panel や GroupBox などのコンテナに配置されていても見つけられるようにするには Find メソッドを使ったほうがいいと思います。

Dim ControlArray() As Control = Me.Controls.Find("PictureBox1"True)
If ControlArray.Length > 0 Then '見つかった時 
 DirectCast(ControlArray(0), PictureBox).Image = Nothing
End If
投稿者 まだまだ  (中学生) 投稿日時 2009/6/11 03:22:16
ご回答ありがとうございます。
daiveさんのはいろいろなプログラムで使えそうです。ありがとうございます。
mitchinさんのはとても短くて手軽に使えます。ありがとうございます。

おかげ様でピクチャーボックスのイメージは消せたのですが、mitchinさんの方法で
DirectCast(Me.Controls.Item(strPicrrc), PictureBox).Image = My.Resources.koma1
(strPicrrcはコントロール名)
と書くとエラーになってしまいます。
なぜでしょうか?
投稿者 mitchin  (社会人) 投稿日時 2009/6/11 04:26:57
koma1 はイメージリソースですか?

PictureBox.Image プロパティは Image 型なので、Image またはその派生クラスのオブジェクトじゃないと格納できません。

エラーになってしまうのが、コンパイルエラーなのか実行時エラーなのか判りませんが、Option Strict が On になっていないなら On にしてみてください。
実行時にエラーが発生するなら、どういう例外が発生するか確認してみてください。
投稿者 まだまだ  (中学生) 投稿日時 2009/6/13 01:16:58
はい、koma1はイメージリソースです。
書き忘れてすみません。

今動かしてみると何事もなかったかのように動きます。
ありがとうございました。