アプリ版:「スタンプのみでお礼する」機能のリリースについて

教えてください。
実行中にコントロールを生成したいのですが、

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))などと変えたりしても別のエラーになり、
基本的に間違っている気がしますがどこだかがわかりません。

詳しい方、宜しくお願い致します。

A 回答 (1件)

Control.ControlCollection.AddRangeはControlの一次元配列を引数にとります。


ref) http://msdn.microsoft.com/ja-jp/library/system.w …

このため,二次元配列を直接引数に渡すことはできません。
一次元配列にすれば良いのですが,配列はIEnumerable(Of T)を一次元配列の時のみ実装するため,
myTxt.Cast(Of Control).ToArray()
のようにIEnumerable(Of Control)を経由して一次元配列にすればよいでしょう。
# IE(Of T)を二次元配列も実装してくれればToArray()一発だったのですが……。
    • good
    • 0
この回答へのお礼

なるほどIEnumerableインターフェイスを実装して、一次元配列としてまとめる必要があるわけですね。
その方法で試してみます。ありがとうございました。

お礼日時:2012/12/18 15:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!