• ベストアンサー

.NETで動的にボタンイベントを生成する方法

TextBoxに入力された値の数だけ ボタンを生成したいのですが、 配列(ArrayList)にオブジェクト名を追加し、 For Eachで全件処理をしてもボタンのオブジェクト 名がうまく宣言できず生成したボタンに対し、 色の設定ができません。 .NETのバージョンは2003で、Frameworkのバージョンが1.0です。 良い解決方法があれば教えてください。

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

  • ベストアンサー
noname#187541
noname#187541
回答No.1

こんばんは。 動的にコントロールを配置する http://vbdotnet.fc2web.com/vbnet/control/Control01.htm 参考にどうぞ。

phoenixHamatani
質問者

お礼

ありがとうございます。 大変、参考になりました。

phoenixHamatani
質問者

補足

回答ありがとうござます。 続けての質問申し訳ありませんが、 サンプルソースの部分の Private btnArray(9) As Windows.Forms.Button この部分をローカル(Form_Loadなど)で行いたいのですが、またそれが出来ない場合、この部分を動的に宣言することは出来ますか

その他の回答 (3)

noname#187541
noname#187541
回答No.4

こんばんは。 私の単純なミスですね。 Me.btnArray = New System.Windows.Forms.TextBox(Num) {}          ↓ Me.btnArray = New System.Windows.Forms.Button(Num) {} としてください。 ですが、これくらいの間違いは気づいて欲しいです。 Buttonを作るのだから、TextBoxだとおかしいと。 エラーメッセージを見ても分かりそうに思うのですが。

noname#187541
noname#187541
回答No.3

No.2ですがミスがありましアタので訂正です。 >Me. = New System.Windows.Forms.TextBox(Num) {}          ↓ Me.btnArray = New System.Windows.Forms.TextBox(Num) {} としてください。

phoenixHamatani
質問者

補足

返信ありがとうございます。 わかりずらい文章で申し訳ないです。 解釈としてはそのとおりです。 New System.Windows.Forms.TextBox(Num) {} この部分で 'System.Windows.Forms.TextBox'は'System.Windows.Forms.Button'から派生していない、 型'System.Windows.Forms.TextBoxの一次元配列'の値を'System.Windows.Forms.Buttonの一次元配列'に変換できません というエラーが出るのですがどうしたらいいですか

noname#187541
noname#187541
回答No.2

質問の意味がよく分かりませんが、参考URLだとあらかじめ10個としているので、これをTextBoxに入力去れ炊かずにしたいと言うことでいいでしょうか。 まず >Private btnArray(9) As Windows.Forms.Button        ↓ Private btnArray() As Windows.Forms.Button としてください。 サンプルではフォームのLoadイベントで行っていますが、TextBoxに入力してから行うためにTextBoxのValidatingイベントで行います。 Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As _ System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating '数値以外の入力はやり直し If IsNumeric(TextBox1.Text) = False Then e.Cancel = True Exit Sub End If Dim I As Integer Dim Num As Integer = Cint(Me.TextBox1.Text) - 1 Me. = New System.Windows.Forms.TextBox(Num) {} For I = 0 To Num '2-1)インスタンスを作成 btnArray(I) = New Windows.Forms.Button '2-2)配置位置を設定 btnArray(I).Location = New Point(10, 10 + 20 * I + 2) '2-3)Nameプロパティを設定 btnArray(I).Name = "Button" & I.ToString '2-4)サイズを設定 btnArray(I).Size = New System.Drawing.Size(100, 20) '2-5)TabIndexを設定 btnArray(I).TabIndex = I + 1 '2-6)ボタンテキストを設定 btnArray(I).Text = "ボタン" & I.ToString '2-7)イベントハンドラの登録 AddHandler btnArray(I).Click, AddressOf ButtonClick '2-8)フォームに配置 Me.Controls.Add(btnArray(I)) Next End Sub 試してませんがこんな感じでしょうか。

関連するQ&A

  • コマンドボタンを削除しないか自動生成する

    エクセルのマクロで、不要な表やオブジェクトを一括で削除するためのマクロを作成し、コマンドボタンをシートに作成してマクロを登録しています。 コマンドを実行すると、不要な表やオブジェクトと一緒に、マクロを実行するためのコマンドボタンも削除されてしまいます。 そのため、コマンドボタンを削除されないためにはどうしたらいいでしょうか。 あるいは、コマンドボタンを自動で生成し、マクロを登録するにはどうしたらいいでしょうか。 参考までに、オブジェクトを削除するマクロは次の通りです。 Sub 削除() Cells.Delete Dim shp As Shape For Each shp In ActiveSheet.Shapes shp.Delete Next shp End Sub よろしくお願い致します。

  • C#.NET ArrayListの使用方法について

    C#.NETを使用しています。ArrayListを宣言、インスタンス化し、 "別々の値を持つ"要素20個をAdd(追加)しているはずなのですが、 要素を取り出して、値を見てみると"同じ値"になってしまっています。 自分なりに考えたのですが原因がわかりません。 どなたかご教授お願いします。 書いたソースは以下のような感じです。 public class Area{ _____// リスト _____public ArrayList list; _____//コンストラクタ _____public Area(){ _________ list = new ArrayList(); __________//要素の作成は以下で行う __________for(int cnt=0;cnt<20;cnt++){ ___________ AddNodeList(new 要素); } _____} _____public void AddNodeList(要素){ _______要素型 a = 要素; _______list.Add(a); _____} }

  • 動的に生成したボタンのイベントが拾えない

    環境は、Visual Web Developer 2008 Express Editon with C# です。 データベースは、Oracle 10g Express Edition です。 触り始めて、1週間程度ですので、お手やらかに。 次のようなコードで、Oracleから取得した値をテーブルに表示しています。ここでreaderは、System.Data.OracleClient.OracleDataReaderラスのオブジェクト、Menuは、System.Web.UI.WebControls.Tableクラスのオブジェクトです。 while (reader.Read()) {   object[] values = new object[3];   int i = reader.GetOracleValues(values);   TableRow r = new TableRow();   TableCell delcom = new TableCell();   Button delButton = new Button();   delButton.Click += new EventHandler(delButton_Click);   delButton.Text = "削除";   delcom.Controls.Add(delButton);   r.Cells.Add(delcom);   for (int j = 0; j < 3; j++)   {     TableCell cell = new TableCell();     cell.Text = values[j].ToString();     r.Cells.Add(cell);   }   Menu.Rows.Add(r); } このコードは、メソッドにして、Page_Loadおよび、delButton_Clickの両メソッドから呼び出しています。 ここで、各行に貼り付けた「削除」ボタンを押すと、1回目では削除されず、2回目で削除されるという現象が起きています。 デバッガで追うと、1回目はdelButton_Clickメソッドが呼ばれず、2回目では呼ばれています。 1回目の表示では、設定したイベントが 色々、調べてみましたが、ちょっとお手上げです。 どのようにすれば、毎回この設定したイベントが有効になるかお知恵を拝借できないでしょうか? よろしくお願いします。

  • 配列名の異なる配列を一気に100個生成する方法はありますか?

    配列名の異なる配列を一気に100個生成する方法はありますか? double[] a1 = new double[50] double[] a2 = new double[50]       ・       ・       ・ double[] a100 = new double[50]; といちいち100回宣言するのがめんどうなのでいい方法はないでしょうか?

    • ベストアンサー
    • Java
  • コントロールが配列かどうかを知るには?

    Visual Basic6.0(SP5)で伺いたいことがあります。 フォーム上の全てのオブジェクトを For Each文で取得しています。以下の様にです。 Dim Control As Object For Each Control In Form1.Controls If TypeOf Control Is Text Then End If Next Control このとき個々のControlがコントロール配列かどうかを知りたいのですが、どうすればよろしいでしょうか?フォーム上にはコントロール配列のオブジェクトも、コントロール配列ではないオブジェクトもあります。 Control.Indexの値を参照しようとしても、コントロール配列でない場合は 「配列ではないオブジェクトです」とエラーになります。 IsArray関数でもFalseになってしまいます。 何を行いたいかというと、そのControlがコントロール配列(Text1(0)とかText1(1)とか)かどうかを調べて、そのIndexをある関数の引数にしたいのです。全てコントロール配列だったら、Control.Indexで値を取得できるのですが。 よろしくお願いします。

  • ActionScriptで配列をクリアする方法を教えてください。

    ActionScriptで、オブジェクトを格納した配列をクリアする正しい方法を教えてください。 具体的には、 ・new Array() で配列を生成する。 ・new Object() で生成したオブジェクトを配列に格納する。 ・配列の中身を処理したあと、配列を一度クリアする。 ・配列に別のオブジェクトを格納する。 ような処理をしたいのですが、メモリリークを起こさずに配列をクリアするにはどうしたらいいでしょうか? 例えば、イメージはこんな感じです。(意味のないコードですが) // 配列の生成 var arr = new Array(); // 配列にオブジェクトを格納 for (var i = 0; i < 5; i++) { var obj = new Object(); obj.num = i; } // 配列のクリア arr.length = 0; // クリアした配列に別のオブジェクトを格納 for (var i = 0; i < 5; i++) { var obj = new Object(); obj.num = i * 2; } 上記のコードで、arr.length = 0; で配列をクリアしていますが、これで配列に格納されたオブジェクトが確保したメモリがすべて解放されるでしょうか? あるいは、配列の内容がなくなるまで pop() 等で取り出す等の処理をする必要があるでしょうか? 以上よろしくお願いします。

    • ベストアンサー
    • Flash
  • ArrayListの初期値に二次元配列を設定したい(VB2005)

    下記は、aryhogeにTextBoxオブジェクトを格納する処理です。 ---------------------------------------- 'a) Dim hoge()() As TextBox = _       {New TextBox() {txta01, txtb01, txtc01}, _       New TextBox() {txta02, txtb02, txtc02}, _       New TextBox() {txta03, txtb03, txtc03}} Dim aryhoge As New ArrayList    'b) aryhoge.Add(hoge(0)) aryhoge.Add(hoge(1)) aryhoge.Add(hoge(2)) ---------------------------------------- (a)を(b)の初期値として設定するにはどのようにすればよいか、ということが質問内容です。 試しに(b)の部分を以下のようにしてみましたが、「1次元配列の値を変換できない」とのエラーが出ました。 Dim aryhoge As New ArrayList(New TextBox() {hoge(0), hoge(1), hoge(2)}) どうぞよろしくお願い致します。

  • 目次のようなハイパーリンクを自動生成したい

    いつもお世話になっております。 みなさんからのご指導の下、なんとか以下のマクロを作成しました。 まず、(逐次追加される)シート名をセルから参照し、トップページにシート名の一覧を自動生成させ、余分なページを削除するマクロなんですが、ここから各シートへのハイパーリンク(またはそれに代わるもの)を自動作成するマクロを追加したいと考えていますが、いろんなサイトを検索しても、なかなかヒットしませんでした。 どなたかご教示頂きますよう、お願いいたします。 Sub ボタン7_Click() Dim i As Long For i = 7 To Worksheets.Count Worksheets(i).Name = Worksheets(i).Range("B2") Next i Dim objSheet As Object Dim intLoop As Integer Cells(16, 8).Activate intLoop = ActiveCell.Row For Each objSheet In ActiveWorkbook.Sheets ActiveWorkbook.ActiveSheet.Cells(intLoop, ActiveCell.Column).Value = objSheet.Name intLoop = intLoop + 1 Next Range("h16:h21").Delete Shift:=xlUp End Sub

  • VB.netのコレクションについて

    VB.netのコレクションについて質問です。 キーとオブジェクトのセットで追加できる配列ですが、例えば、 いちご,100 りんご,200 バナナ,300 とセットするとして、いちごだったら、100+10 というように、キーで検索してオブジェクトの値を更新していくというプログラムを書きたいのですが、調べたらすでにあるキーに対してオブジェクトを更新したい場合、一度そのセットを削除してから追加する。というようなことが書いてあるサイトもあったのですが、このような更新することについて書いてあるものが少なく、本当に削除してから追加しなければいけないのかお聞きしたいのですが、そのままキーを指定して値を入れることはできないのでしょうか? よろしくお願いいたします。

  • VB.netでAccess操作

    タイトル通り、VB.netでAccessを操作するプログラムを作っています。 項目が、『番号』『氏名』『選択科目1』『選択科目2』 VBのフォーム上にAccessのファイルに登録されている全てのデータを取り出して二次元配列のように表示させます。 ボタンは編集、削除、行追加です。 編集 --- このボタンを押すとAccessに反映 削除 --- このボタンを押すとチェックボックスにチェックされた行が削除される 行追加 --- このボタンを押すと、表示されているデータの下に一行分、行が追加され、そこから入力できるようになる 私はtextboxを動的に配置して、textboxを二次元配列で処理できるようにプログラムを組んでみたのですが 何だか上手なプログラムが組めなくなってしまいまして困っているところです・・・。 仕様には、登録データ分だけの行数が表示されなくてはいけないと書いてあります。 つまり削除がある時点で、一行分を削除するためにはtextboxを消さなくてはいけなくなってしまいました。 (ex データが四件あるとして、その時点ではtextbox(0,0) ~ textbox(3,3)    ですが、一件削除するとtextbox(0,0)~textbox(2,3)になり  textbox(3,0)textbox(3,1)textbox(3,2)textbox(3,3)を削除しなければいけない) 非表示ではなく、textboxコントロール自体を削除したいのですが、そんな方法はあるのでしょうか? それともこのプログラムの組み方は間違った方法なのでしょうか? VB.net初心者のため、未だにどんなコントロールを使えばうまく処理できるのか分かっていないところがありますので、 どんな些細なことでもお気づきのことがありましたら、教えてください。 自分だったらこんな機能や処理をする!ということもお待ちしております。 宜しくお願いします。

専門家に質問してみよう