VB2005でコントロールを配列にする方法

このQ&Aのポイント
  • VB2005でコントロールを配列にしたい場合、以下の手順で実装することができます。
  • まず、Dim文を使用してコントロールの配列を宣言します。
  • その後、各要素に対して値やプロパティを設定し、フォームに追加することで複数のボタンを作成することができます。
回答を見る
  • ベストアンサー

【VB2005】コントロールを配列に。

下記のコードを変更して、コントロールの値を配列に代入して、 その値をもとに、ボタンを複製して追加したいと思っています。 Public Class frmStart Dim btnNewButton1 As New Button Private Sub frmStart_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load NewButton1.Text = "処理1" btnNewButton1.ForeColor = Color.DimGray btnNewButton1.Location = New Point(10, 100) btnNewButton1.Size = New Size(180, 30) '// ボタンを追加します Me.Controls.Add(btnNewButton1) end sub End Class やりたいことは、Dim btnNewButton() As New Button のようにデータを配列にして、 btnNewButton(0).ForeColor = Color.DimGray btnNewButton(0).Location = New Point(10, 100) btnNewButton(0).Size = New Size(180, 30) btnNewButton(1).ForeColor = Color.DimGray btnNewButton(1).Location = New Point(380, 100) btnNewButton(1).Size = New Size(180, 30) '// ボタンを追加します Me.Controls.Add(btnNewButton(0))     Me.Controls.Add(btnNewButton(1)) という事をしたいのですが、方法が解らなくて困ってます。 お知恵を貸してください。

質問者が選んだベストアンサー

  • ベストアンサー
  • unamana19
  • ベストアンサー率62% (56/89)
回答No.1

VB2005でコントロール配列は、VB6のようにはいきませんから、面倒ですよね。 面倒ですけど、配列に格納して、イベントを割り付けるみたいなことをしないと駄目ですね。 Public Class Form1   Private _Buttons As New List(Of Button)   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load     'ボタンを配列に追加     Me._Buttons.Add(New Button)     Me._Buttons.Add(New Button)     Me._Buttons.Add(New Button)     '初期化     For i As Integer = 0 To Me._Buttons.Count - 1       ''フォームへボタンを追加       Me.Controls.Add(Me._Buttons(i))       ''Clickイベント       AddHandler Me._Buttons(i).Click, AddressOf Buttons_Click       ''Buttonのプロパティを設定       With Me._Buttons(i)         .Text = i.ToString         .ForeColor = Color.DimGray         .Location = New Point(10, i * 50)         .Size = New Size(180, 30)         .Tag = i.ToString       End With     Next   End Sub   Private Sub Buttons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)     Dim btn As Button = CType(sender, Button)     If btn.Tag Is Nothing Then Exit Sub     MessageBox.Show(String.Format("{0}番のボタンが押されました", btn.Tag.ToString), "クリック")   End Sub End Class このサンプルでは、ButtonのTagプロパティに配列番号を格納して、それをもとに、どのボタンが 押されたかを判断しています。 【注意】上記ソースの空白は、表示の関係で全角スペースになっています。

dizzdive
質問者

お礼

自分の先輩など、教えてもらいながら、仮のコードが できたのですが、配列の考えまではTagっぽいと思ってたのですが、 一般的に使えると思って、ほっとしました。 自分のやり方↓ Public Class frmStart Dim btnNewButton() As Button Private Sub frmStart_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim intCnt As Integer Dim intIndex As Integer Dim intLocation() As Integer intIndex = 8 ReDim intLocation(intIndex) ReDim btnNewButton(intIndex) For intCnt = 0 To intIndex Select Case intCnt Case 0, 3, 6 intLocation(intCnt) = 69 Case 1, 4, 7 intLocation(intCnt) = 255 Case 2, 5, 8 intLocation(intCnt) = 441 End Select Next For intCnt = 0 To intIndex btnNewButton(intCnt) = New Button Next For intCnt = 0 To intIndex btnNewButton(intCnt).Text = intCnt btnNewButton(intCnt).ForeColor = Color.DimGray btnNewButton(intCnt).Size = New Size(180, 30) Select Case intCnt Case 0 To 2 btnNewButton(intCnt).Location = New Point(intLocation(intCnt), 83) Case 3 To 5 btnNewButton(intCnt).Location = New Point(intLocation(intCnt), 119) Case 6 To 8 btnNewButton(intCnt).Location = New Point(intLocation(intCnt), 155) End Select '// ボタンを追加します Me.Controls.Add(btnNewButton(intCnt)) '// 関連付けるイベント AddHandler btnNewButton(intCnt).Click, AddressOf btnNewButton_Click Next End Sub クリックイベントは省略してます。

関連するQ&A

  • 【VB2005】 実行時に動的にコントロールを作成した後のコントロールへの処理

    こんばんわ、VB5.0を1週間ほどかじって現在2005に乗り換えたばかりのド初心者です。 (用語の使い方などが間違っている可能性があるかもしれません。おかしなところは指摘していただけるとありがたいです) VB5.0を使っていたときはコントロール配列を使って簡単にできた事が2005になってコントロール配列を使えなくなったため行き詰ってしまいました。 内容は、ある操作をすると画面にコントロールが1つずつ追加されていき、そのコントロールのプロパティを他のコントロールから操作できるようにする物です。 検索などで情報を集めて、なんとかコントロールを追加していくことができるようにはなったのですが、プロパティを変更するためにコントロールにアクセスする際にエラーになってしまって困っています。 一つだけコントロールが追加された場合は、問題なくプロパティをいじれるのですが、2つ以上追加した場合に最新のコントロール以外のプロパティをいじろうとするとエラーになってしまうのです。 下に私の作りたいプログラムを簡潔にしたサンプルソースを記述させていただきます。 間違いの指摘やアドバイスをいただければ幸いです。 FormにはAddButtonというボタンが一つだけあります。 Dim Index As Integer Private Buttons() As System.Windows.Forms.Button Private Labels() As System.Windows.Forms.Label Private Sub AddButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddButton.Click Index += 1 Me.Buttons = New System.Windows.Forms.Button(Index) {} Me.Labels = New System.Windows.Forms.Label(Index) {} Me.SuspendLayout() Me.Buttons(Index - 1) = New System.Windows.Forms.Button Me.Buttons(Index - 1).Text = Index - 1 Me.Buttons(Index - 1).Size = New Size(30, 30) Me.Buttons(Index - 1).Location = New Point((Index - 1) * 30, 50) Me.Labels(Index - 1) = New System.Windows.Forms.Label Me.Labels(Index - 1).Text = Index - 1 Me.Labels(Index - 1).Size = New Size(30, 30) Me.Labels(Index - 1).Location = New Point((Index - 1) * 30, 100) AddHandler Me.Buttons(Index - 1).Click, _ AddressOf Me.Buttons_Click Me.Controls.AddRange(Me.Buttons) Me.Controls.AddRange(Me.Labels) Me.ResumeLayout(False) End Sub Private Sub Buttons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Labels(sender.text).ForeColor = Color.Red End Sub

  • VB2005で、動的にコントロールを作成出来ない件

    MDIのフォームで、 子フォーム1にコントロール(ラベルなど)を追加したい場合、 子フォーム2のボタンクリックで追加しようとすると 追加されません。 (子フォーム1のボタンで同一フォームへコントロールを  追加しようとすると追加できました。) どのようにすれば追加できるでしょうか? 子フォーム2の追加ボタン関数のコード Private Sub Add_click()  AddLabel(子フォーム1, "hogehoge") End Sub モジュール(関数群)のコード Private Sub AddLabel(Byval objForm As Form, ByVal strText As String)  Dim ctlAddLabel As New Label()  With ctlAddLabel   .AutoSize = False   .Location = New Point(0, 0)   .Size = New Size(200, 40)   .Name = "Label" & Counter 'Counter は追加の度に1ずつ増えます   .Text = strText  End With  objForm.Controls.Add(ctrlAddLabel) End Sub

  • コントロールの配列について

    VB2005で質問です。 初心者のため勉強しながら作成している為かうまくできません。コントロール配列を使ってボタンを204個、 チェックボックスを768個表示するプログラムを作りました。 6個のボタンのうち、1個のボタンをクリックすると128個のチェックボックスがONし、 別の6個のボタンのうち1個は、128個のチェックボックスがOFFし、 96個のボタンは、1個押すと8個のチェックボックスがONし、残りの96個はOFFするプログラムを作成していますが、 配列に登録した名前でクリックイベントハンドラーを作成すると 「HANDOLES句には、それを含む型または基本型の1つで定義されたWith Events変数が必要です」というエラー表示が出ます。 またチェックボックスも同じように名前は宣言されていませんと出ますが、 どう直せば良いか把握できていないのでどなたか教えて貰えないでしょうか。 Dim chkIo(768) As System.Windows.Forms.CheckBox Dim btnIdOn(6) As System.Windows.Forms.Button Dim btnIdOff(6) As System.Windows.Forms.Button Dim btnIoOn(96) As System.Windows.Forms.Button Dim btnIoOff(96) As System.Windows.Forms.Button Const strName1 As String = "chkIo" Const strName2 As String = "btnIdOn" Const strName3 As String = "btnIdOff" Const strName4 As String = "btnIoOn" Const strName5 As String = "btnIoOff" Dim i As Integer Dim a As Integer Dim b As Integer Dim c As Integer Dim d As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For c = 0 To 5 For i = 0 To 127 Checkboxio() Next b = 0 ButtonIoOn() b = 0 ButtonIoOff() ButtonIdOn() ButtonIdOff() Next End Sub Public Sub Checkboxio() chkIo(i) = New CheckBox With chkIo(i) .Size = New Size(15, 15) If i < 8 Then a = i b = 0 Contchk() 以下省略 ElseIf i < 128 Then a = i - 120 b = 15 Contchk() End If End With Me.Controls.Add(chkIo(i)) End Sub Public Sub Contchk() With chkIo(i) .Location = New Point((a * 25) + (290 * c) + 80, (b * 35) + 75) a = a + (10 * b) + (200 * c) .Tag = a .Name = strName1 & a.ToString End With End Sub Public Sub ButtonIoOn() For i = 0 To 15 btnIoOn(i) = New Button With btnIoOn(i) a = i .Size = New Size(15, 15) .Location = New Point((290 * c) + 19, (b * 35) + 74) a = a + (20 * c) .Name = strName4 & a.ToString b = b + 1 End With Me.Controls.Add(btnIoOn(i)) Next End Sub Public Sub ButtonIoOff() For i = 0 To 15 btnIoOff(i) = New Button 以下省略 Next End Sub Public Sub ButtonIdOn() 以下省略 End Sub Public Sub ButtonIdOff() btnIdOff(c) = New Button With btnIdOff(c) .Size = New Size(15, 15) .Location = New Point((290 * c) + 154, 29) .Name = strName3 & c.ToString End With Me.Controls.Add(btnIdOff(c)) End Sub ここからエラーがでたプログラムです Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIdOn.Click, btnIdOn1.Click, btnIdOn2.Click, btnIdOn3.Click, btnIdOn4.Click, btnIdOn5.Click, btnIdOff0.Click, _ btnIdOff1.Click, btnIdOff2.Click, btnIdOff3.Click, btnIdOff4.Click, btnIdOff5.Click, btnIoOn0.Click  Select Case DirectCast(sender, Button).Name Case btnIoOn0.Name For i = 0 To 7 Me.chkIo(i).Checked = True Next End Select End Sub

  • VB2010でのコントロール多次元配列について

    教えてください。 実行中にコントロールを生成したいのですが、 Public Class Form1  Private myTxt(,) As System.Windows.Forms.TextBox  Me.myTxt = New System.Windows.Forms.TextBox(59, 2) {}  Dim i As Integer  Dim j As Integer  Dim h As Integer  Dim p As Integer  h = 10  p = 100  For i = 0 To Me.myTxt.GetLength(0) - 1   For j = 0 To Me.myTxt.GetLength(1) - 1    Me.myTxt(i, j) = New System.Windows.Forms.TextBox    Me.myTxt(i, j).Name = "myTxt" + i.ToString() + j.ToString()    Me.myTxt(i, j).Size = New Size(100, 30)    Me.myTxt(i, j).Location = New Point(p, h)    p = p + 100   Next j   h = h + 30  Next i  Me.myPnl.Controls.AddRange(Me.myTxt) と書くと最後の行が波線になり、 “型 'System.Windows.Forms.TextBox の 2 次元配列' の値を 'System.Windows.Forms.Control' に変換できません。”とエラーになります。 これはAddRangeは多次元配列に使用できないということなのでしょうか? 色々検索してみましたが、コントロールの生成に関する多次元配列が見つけられずに 困っていました。 最後のAddRange(Me.myTxt)をAdd(Me.myTxt(i,j))などと変えたりしても別のエラーになり、 基本的に間違っている気がしますがどこだかがわかりません。 詳しい方、宜しくお願い致します。

  • VBプログラムエラー

    Private number As Integer Private rows As Integer Private columns As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim form2 As New Form() ' Create a button to add to the new form. Dim button1 As New Button() ' Set text for the button. button1.Text = "Scrolled Button" ' Set the size of the button. button1.Size = New Size(1000, 800) ' Set the location of the button to be outside the form's client area. button1.Location = New Point(form2.Size.Width + 200, form2.Size.Height + 200) ' Add the button control to the new form. form2.Controls.Add(button1) ' Set the AutoScroll property to true to provide scrollbars. form2.AutoScroll = True ' Display the new form as a dialog box. form2.ShowDialog() If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 900) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub スクロール画面を作成し、 そのスクロール画面上にボタンを1つ作り、 テキストボックスが出てくるようにしたいです。 どうすればできるのでしょうか 。 これはわかるところまで作成しています。

  • コード上でコントロール配置

    いつもお世話になっております。 コード上でコントロールを配置したいのですが、うまくいきません。 Dim location As New Point(100, 100) Dim button As Button button = New Button button.Height = 50 button.Weight = 50 button.Location = location button.Visible = True 何が足りないのか・・教えていただきたいです。。

  • ユーザーコントロールの配列化

    VB.NETのWindowsコントロールライブラリで作成したコントロールをメインになるプロジェクトから動的に呼び出したいのですが、複数のコントロールをボタンで表示非表示を行いたいので、配列化したいと考えているのですが、どのようにすればよいですか? public testControl() as Object Private Sub Form_Load(... testControl(0) = New Test1.Form1 testControl(1) = New Test2.Form1 testControl(2) = New Test3.Form1 ... For i = 0 to 10 testcontrol(i).Location = New Point(0,0) testcontrol(i).Size = New Size(100,100) testcontrol(i).Visible = False Next End Sub 見たいな処理を行いたいと考えています。 ほかによい方法があれば教えてください。

  • VB.net フォームをなめらかに移動する方法

    フォームをなめらかに移動する方法はないでしょうか? 以下のコードのように、Locationで位置を変更すると、カクカク移動してしまいます。 ご存知の方おしえてください。どうぞよろしくお願いいたします。 Private Sub Form1_Mousemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove Dim WorkingArea As Rectangle = Screen.PrimaryScreen.WorkingArea Dim MousePos As Point = Me.PointToClient(Windows.Forms.Cursor.Position) '上に移動 If Me.Size.Height * 0.8 < MousePos.Y And Me.Location.Y > 0 Then Me.Location = New Point(Me.Location.X, Me.Location.Y - 20) End If '下に移動 If Me.Size.Height * 0.2 > MousePos.Y And (Me.Location.Y + Me.Size.Height) < WorkingArea.Height Then Me.Location = New Point(Me.Location.X, Me.Location.Y + 20) End If '左に移動 If Me.Size.Width * 0.8 < MousePos.X And Me.Location.X > 0 Then Me.Location = New Point(Me.Location.X - 20, Me.Location.Y) End If '右に移動 If Me.Size.Width * 0.2 > MousePos.X And (Me.Location.X + Me.Size.Width) < WorkingArea.Width Then Me.Location = New Point(Me.Location.X + 20, Me.Location.Y) End If End Sub

  • 【vb2005】 動的に作成されたComboBoxをイベントハンドラへ関連づけする際の問題

    おはようございます。 VB5.0を1週間ほどかじって現在2005に乗り換えたばかりのド初心者です。 (用語の使い方などが間違っているかもしれません。おかしなところは指摘していただけるとありがたいです) 実行時に動的(?)に作成されたComboBoxをイベントハンドラへ関連付けようとしているのですが、ClickやLeaveなどで関連づけると正常に動作するのにTextChangedの場合になぜか認識してもらえません。 原因の見当がまったくつかず、困り果てています。 内容は、まずボタンを押すとコンボボックスが2つずつ追加されます。そのコンボボックスのリストを選ぶ際、追加されたふたつが同じものを選んでいると色が変わるようにするものです。 下にそのソースを簡潔にしたサンプルを記述させていただきます。 間違いの指摘や、うまくいかない原因、アドバイスなど頂ければ幸いです。 (formにはButton1というボタンが一つだけあります。) Dim Index As Integer Private CBox1() As ComboBox Private CBox2() As ComboBox Private Sub CBB_LT_SameErroCheck(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim T As Integer T = sender.Tag If CBox1(T).Text = "" Then Exit Sub End If If CBox1(T).Text = CBox2(T).Text Then CBox1(T).BackColor = Color.Red CBox2(T).BackColor = Color.Red Else CBox1(T).BackColor = Color.White CBox2(T).BackColor = Color.White End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ReDim Preserve CBox1(Index) ReDim Preserve CBox2(Index) SuspendLayout() CBox1(Index) = New ComboBox CBox2(Index) = New ComboBox With CBox1(Index) .Location = New Point(105, Index * 20) .Size = New Size(95, 20) .DropDownStyle = ComboBoxStyle.DropDownList .Tag = Index .Items.Add("List1") .Items.Add("List2") End With With CBox2(Index) .Location = New Point(200, Index * 20) .Size = New Size(95, 20) .DropDownStyle = ComboBoxStyle.DropDownList .Tag = Index .Items.Add("List1") .Items.Add("List2") End With 'AddHandler CBox1(Index).Click, AddressOf CBB_LT_SameErroCheck 'AddHandler CBox2(Index).Click, AddressOf CBB_LT_SameErroCheck AddHandler CBox1(Index).TextChanged, AddressOf CBB_LT_SameErroCheck AddHandler CBox2(Index).TextChanged, AddressOf CBB_LT_SameErroCheck Me.Controls.Add(CBox1(Index)) Me.Controls.Add(CBox2(Index)) ResumeLayout(False) Index += 1 End Sub

  • 実行時追加したコントロールの識別

    VB2008を使用しています。 プログラム実行中に追加したコントロールをどのように識別すればいいのかがわからなくて困っています。 例えば以下のようにすると、 itemsが1と2のコンボボックスが10個できますが、 すべてNewComboBoxという名前のコントロールのため、 最終的にそれぞれ1か2どちらを選択したかを知りたいときに、 10個のコントロールをどのように識別すればよいかわかりません。 Dim NewComboBox As ComboBox = New ComboBox() For i = 1 To 10 NewComboBox = New ComboBox() NewComboBox.Items.Add(1) NewComboBox.Items.Add(2) NewComboBox.Location = New Point(5, 5 + (24 * (i - 1))) Me.Controls.Add(NewComboBox) Next 説明が不明瞭であるかもしれませんが、 お分かりの方いらっしゃいましたら、ご回答願います。

専門家に質問してみよう