tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルテキストボックスの追加
記事No7919
投稿日: 2008/08/07(Thu) 15:17
投稿者タロ
いつもお世話になってます。
やりたいことは、追加ボタンを押下するとテキストボックスがフォーム上に追加したいのです。
(フォーム上にTextBox1を配置し、追加ボタンを押下するとTextBox1の下にTextBox2が出現。またボタンを押下するとTextBox2の下にTextBox3のような)
当初は、DataGridViewで対処しようと思いましたが、Enterキーでの改行入力をしたかったので、テキストボックスにするしかないのかなと。
よろしくお願い致します。
開発:VB2008

[ツリー表示へ]
タイトルRe: テキストボックスの追加
記事No7921
投稿日: 2008/08/07(Thu) 15:21
投稿者魔界の仮面弁士
> やりたいことは、追加ボタンを押下するとテキストボックスがフォーム上に追加したいのです。
Controls.Add メソッドで追加できますよ。

[ツリー表示へ]
タイトルRe^2: テキストボックスの追加
記事No7924
投稿日: 2008/08/07(Thu) 17:11
投稿者タロ
魔界の仮面弁士さん、回答ありがとうございます。
Controls.Addメソッドを調べていきたいと思います。
このメソッドを使えば、フォーム上にPanel1(中にテキストボックスとDateTimePicker)を配置し、追加ボタンでPanel1が追加することも可能になるのですか。
よろしくお願い致します。

[ツリー表示へ]
タイトルRe^3: テキストボックスの追加
記事No7925
投稿日: 2008/08/07(Thu) 17:37
投稿者魔界の仮面弁士
> このメソッドを使えば、フォーム上にPanel1(中にテキストボックスとDateTimePicker)を配置し、追加ボタンでPanel1が追加することも可能になるのですか。

そもそも Visual Studio が、「コントロールを配置するためのコード」を
自動生成してくれています。

プロジェクトを保存したフォルダを見ると、Form1.vb と一緒に Form1.designer.vb という
ファイルが置いてありますよね。そこに、Controls.Add 等の自動生成されたコードが
書かれていますので、参考にしてみては如何でしょう。

(Form1.designer.vb は通常、開発環境からは非表示になっていますが、
 ソリューション エクスプローラの設定を変更すると、表示させる事ができます)

[ツリー表示へ]
タイトルRe^4: テキストボックスの追加
記事No7949
投稿日: 2008/08/13(Wed) 16:30
投稿者タロ
魔界の仮面弁士さん、解決致しました。

Private field_txt() As System.Windows.Forms.TextBox
Private field_pnl() As System.Windows.Forms.Panel

Me.field_txt = New System.Windows.Forms.TextBox(end_row - 1) {}
Me.field_pnl = New System.Windows.Forms.Panel(end_row - 1) {}

        For iRows = start_row To end_row
            Me.field_pnl(iRows - 1) = New System.Windows.Forms.Panel()
            With Me.field_pnl(iRows - 1)
                'プロパティ設定
                .Name = iRows.ToString()
                .BorderStyle = BorderStyle.FixedSingle
                .Location = New Point(0, 530 + 48 * (iRows - 1))
                .Size = New Point(608, 49)
            End With

            Me.field_txt(iRows - 1) = New System.Windows.Forms.TextBox
            With Me.field_txt(iRows - 1)
                'プロパティ設定
                .Name = "txt_KIROKU" + iRows.ToString()
                .Text = ""
                .Location = New Point(110, -1)
                .Multiline = True
                .Size = New Point(497, 49)
            End With

            Me.Controls.Add(Me.field_pnl(iRows - 1))
            field_pnl(iRows - 1).Controls.Add(field_txt(iRows - 1))

        Next

        Me.ResumeLayout(False)

こんな感じで無事に解決致しました。
追加ボタンを押下したら行がぺこぺこ増える仕様です。
増えた行のテキストを読み取るには、
        For i = 0 To field_pnl.Count - 1
            Dim cFindControl1 As Control = FindControl(Me, "txt_KIROKU" + (i + 1).ToString)

            If Not cFindControl1 Is Nothing Then
                aa = cFindControl1.Text
            End If
        Next
こんな感じで読取出来ました。

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

[ツリー表示へ]
タイトルRe^5: テキストボックスの追加
記事No7950
投稿日: 2008/08/13(Wed) 19:48
投稿者魔界の仮面弁士
> For i = 0 To field_pnl.Count - 1
>   Dim cFindControl1 As Control = FindControl(Me, "txt_KIROKU" + (i + 1).ToString)

FindControl で検索せずとも、「field_txt(番号).Text」を使えば、
対象コントロールにアクセスできるのでは無いでしょうか。

[ツリー表示へ]
タイトルRe^6: テキストボックスの追加
記事No7953
投稿日: 2008/08/14(Thu) 18:02
投稿者タロ
私もfield_txt(番号).Textで取得出来るモノと思っていましたが、
追加ボタンを押下して行を増やすと追加した行した取得出来ず、前に存在していた行がNULLになってしまいました。
なので、仕方なくFindControlを使用しています。

何がいけないのでしょうか?

[ツリー表示へ]
タイトルRe^7: テキストボックスの追加
記事No7954
投稿日: 2008/08/14(Thu) 18:41
投稿者魔界の仮面弁士
> 何がいけないのでしょうか?

もしかして、配列を毎回初期化してはいませんか?
>>> Me.field_txt = New System.Windows.Forms.TextBox(end_row - 1) {}

最初に、上限行数の配列を用意し、以降はそれを使いまわすようにしてみてください。
もしも上限数を定めず、可変サイズの配列として運用したいのであれば、たとえば
ReDim Preserve などを利用して、元のデータを残したまま拡張するようにするとか、
あるいは配列の代わりに、List(Of TextBox) クラスなどで管理すれば良いかと。

[ツリー表示へ]
タイトルRe^8: テキストボックスの追加
記事No7971
投稿日: 2008/08/18(Mon) 16:22
投稿者タロ
魔界の仮面弁士さん、ありがとうございます。
ReDim Preserveで対処出来ますね。
ありがとうございました。

[ツリー表示へ]
タイトルRe^9: テキストボックスの追加
記事No7986
投稿日: 2008/08/22(Fri) 11:13
投稿者タロ
追加ばかりに気をとられ、すっかり初期化した場合の処理を忘れておりました。
field_pnl(i).Controls.Clear()すればよいのかと思いましたが、追加した枠が残ってしまいます。
違う処理なのでしょうか。

[ツリー表示へ]
タイトルRe^10: テキストボックスの追加
記事No7987
投稿日: 2008/08/22(Fri) 11:17
投稿者魔界の仮面弁士
> field_pnl(i).Controls.Clear()すればよいのかと思いましたが、

パネル上のコントロールを Clear しているのですね。
ですが、パネルそのものを削除していない、と。

> 追加した枠が残ってしまいます。

フォーム上のパネルも .Controls.Remove(パネル) してください。

[ツリー表示へ]
タイトルRe^11: テキストボックスの追加
記事No7989
投稿日: 2008/08/22(Fri) 11:25
投稿者タロ
魔界の仮面弁士さん
ありがとうございました。
パネルそのものを削除しないといけないのですね。

[ツリー表示へ]