DOBON.NET DOBON.NETプログラミング掲示板過去ログ

【VB.NET】TabControlでページの複製

環境/言語:[WindowsXP+VB.NET]
分類:[.NET]

はじめまして。

WindowsXP+VB.NET環境で、テキスト形式のファイル
・1項目1行
・複数項目で1レコード
・レコードごとに項目数が変動する(項目自体が省略されることがある)
を読み込み、レコードごとにTabControlのページに出力するアプリを作成しています。

流れとしては、
・データを1行読み込み
・レコードの開始定義行なら新しいページを追加
・項目行なら構造体に格納、同時にフォームの対応する項目に設定
というだけで、レコードごとに構造体(配列)に格納する部分は容易にできました。

TabControlのページ上には、表示用のLabelやTextBoxなどが配置されているわけですが、
いちいちレコードごとにインスタンス作成→コントロールを配置とすると、コード量的に
増加し、流れも追いにくくなってしまうし、同じ要素を持つのだから、ページのコピーを
作成して利用しようと思ったのですが、動的にページを追加する際に、既存ページ上のコ
ントロールのコピーを持ったページを作成できません。

Me.TabControl1.TabPages.Insert(newIndex,"") で空のページを作成し、
Me.TabControl1.TabPages(newIndex) = Me.TabControl1.TabPages(refIndex)
としてページのコピーを作成すると、参照元にしたページまで空白になってしまっています。

また、参照元にしたほうが、代入先で埋まったように見えるからといって、=の左右を入れ
替えたところ、配置されているコントロールはコピーされたように見えますが、値を変更す
ると、全てのページで同じように変更されてしまいます。
これはオブジェクトの参照コピー(といえばいいのでしょうか?)になっているためと
思えば、納得がいきますが、求めているコピーとは違うものです。


独立したコントロールとして、配下のコントロールごと複製する手法というのは、あるのでしょうか?
■No6983に返信(ZAPさんの記事)
質問を無視するようですが、そういう仕様ならば画面(TabPage)にデータを持たせるのではなく、
配列化されたコレクション変数に持たせておき、該当タブがActiveになった時に、
そのデータを表示すればいいのではないでしょうか?

画面にデータを持たせるより、変数に持たせた方が軽いのですから。
java.lang.Nullpoさま

返信ありがとうございます。

確かにそうですね。

書き忘れていたのですが、最初の1レコードだけはレコード構造が完全に異なるため、ページ単位で独立して持たせようとしました。
どうせ、このレコードの値は別の構造体に持たせていますから、表示も別ブロックにするなり、いくらでも回避方法はありましたね。

TabControlの見た目ばかり意識して、思考停止していたようです。

助言、ありがとうございました。
解決のチェックを忘れました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板