VB.netでラベルの配列を作るには

解決


shell  2003-11-13 07:08:20  No: 80400

ラベルをフォーム上にある、タブコントロール上に100個くらい張りたいと思っています。

そのラベルをコントロール配列にしたいと思っています。
たとえば、たて10個、横5個の升目状にラベルを貼って、「3列目の2行目のラベルのテキストは何か?」というようなことを取得できるようにしたいのです。
ちなみに、実行時のみラベル表示されるようにするのではなく、がデザイン時に設定したいのですがどうすればよいでしょうか?


Shell  2003-11-13 07:14:48  No: 80401

追加です。
下にも動的にテキストボックスを作る方法がありましたが、
①静的(デザイン時)に作りたい
②フォームではなく、フォーム上のタブコントロールの上にラベルを貼り付けたい
と思っています。
よろしくお願いいたします。


ねろ  URL  2003-11-13 18:53:07  No: 80402

たて10個、横5個じゃあ100個にならないんだけど  (^^;
TabPage1にラベルを50個置いて
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles MyBase.Load
        Dim Lb(10, 5) As Label
        Dim ct As Control
        Dim i As Integer
        For Each ct In TabPage1.Controls
            If Microsoft.VisualBasic.Left(ct.Name, 5) = "Label" Then
                i = Val(Microsoft.VisualBasic.Right(ct.Name, _
                Microsoft.VisualBasic.Len(ct.Name) - 5)) - 1
                Lb(i \ 5, i Mod 5) = CType(ct, Label)
                Lb(i \ 5, i Mod 5).Text = ("Lb:" & Str(i \ 5) & "," & Str(i Mod 5))
            End If
        Next
    End Sub
こんなことですか、あとは煮るなり焼くなりご自由に。


ねろ  2003-11-13 20:09:04  No: 80403

連続投稿で失礼
>Dim Lb(10, 5) As Label

Dim Lb(9, 4) As Label
でもOKですが一番目をLb(1,1)にしたいときの用意です。

Microsoft.VisualBasic.Left等は
クラスの外で
Imports Vb6 = Microsoft.VisualBasic
と宣言して
VB6.Left
とした方が見やすくなります。

それと配列にしたい以外のLabelもFor Eachで引っかかりますが
その場合はNameプロパティではじきます。

沢山のコントロールをデザイン時に置くのは余り薦められません。
変更するのも大変だし。趣味の問題でも有りますが。


shell  2003-11-14 04:52:32  No: 80404

どうもありがとうございました。
早速やってみます。

私もねろさんの言うとおり、たくさんのコントロールをデザイン時に使いたくないのですが、実は、表形式にして数字を表示したかったのです。
以前、VB5を使っていたときはMSFlexGridを使っていました。
NETになってそれに変わるものがなくなりました。
たとえば、
①datagridコントロールはデータベース接続しないと使えないようだし(自分で計算した数字を表形式にしたいだけなので)
②ListViewコントロールを詳細表示して表形式で表示しようとしたのですが、以前のように各セルの背景色を変えたりできないようです。またROW、COLなどを使って簡単に表の中に表示させられず、subitem.add()などを使って、順にサブ項目を表示させるしかないようなので、使いにくい。
というのが主な理由です。
何かいい方法はないものでしょうか?


ねろ  2003-11-14 05:26:08  No: 80405

なるほど事情はわかりました。
>何かいい方法はないものでしょうか?
細かな仕様が判らないのでなんともいえませんが、
私も見やすくて、入力しやすい画面は最終的には
TextBoxやLabelを配置するのが一番であると思っています。

ちょっと私の表現が悪かったのですが、デザイン時というのは
Formデザイナーのことで、Formデザイナーで沢山のコントロールを
置くのはあまりお勧め出来ないということです。
コードで作成するのは別に問題ないと思います。

一つ質問なんですが
>下にも動的にテキストボックスを作る方法がありましたが、
>①静的(デザイン時)に作りたい
これには何か理由があるのでしょうか。
コードでコントロールを作った方が後処理が簡単に
なると思われるのですが。


shell  2003-11-14 05:45:59  No: 80406

以前、コードでラベルを表示させたことはあります。
ホームページか何かのサンプルコードを見て、フォームにラベルをたくさん、表形式で表示させることができたのですが、今回はフォームではなく、TabPageに作りたく、コードからラベルを作れなかったのです。作る方法がわかればそれを使いたいです。
コードで表示するのとデザイン時に作成するのでは後のメンテナンスのしやすさのほかに、たとえばメモリを消費しにくいとかの違いはあるのでしょうか?


ねろ  2003-11-15 07:16:38  No: 80407

>作る方法がわかればそれを使いたいです。
Form以外は全てコードで書いてみました。
    Private Overloads Sub Form1_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load

        '******タブを3つ追加する
        Dim TabControl1 = New TabControl
        Dim TabPage1 = New TabPage  'とりあえず3ページTABを追加
        Dim TabPage2 = New TabPage
        Dim TabPage3 = New TabPage

        Controls.Add(TabControl1)
        With TabControl1
            .Controls.Add(TabPage1)
            .Controls.Add(TabPage2)
            .Controls.Add(TabPage3)
            .top = 0
            .left = 0
            .width = 600
            .height = 300
        End With
        TabPage1.text = "Tab1"
        TabPage2.text = "Tab2"
        TabPage3.text = "Tab3"

        '******ラベルを縦10行、横5列のLabel配列を作成  
        Dim Lb(9, 4) As Label
        Dim n, m As Integer
        For n = 0 To 9
            For m = 0 To 4
                Lb(n, m) = New Label
                Controls.Add(Lb(n, m))        'これを落としやすい
                Lb(n, m).Top = (n Mod 10) * (Lb(0, 0).Height + 1)
                Lb(n, m).Left = (m Mod 5) * (Lb(0, 0).Width + 1)
                Lb(n, m).Parent = TabPage1    'TabPage1をコンテナにします
                Lb(n, m).Text = "Lb(" & n & "," & m & ")"
                Lb(n, m).BackColor = Color.White
                Lb(n, m).BackColor = Color.AliceBlue
            Next
        Next

    End Sub
Tabの作成があり長いコードに見えますが,実はコードで書いた方が簡単なのです。
>たとえばメモリを消費しにくいとかの違いはあるのでしょうか?
あまり関係ないと思います。
主に作成時のスピードアップと後々のメンテナンスのしやすさでしょう。
Formデザイナーで置いてしまうと一列増してほしいなどの仕様変更のとき
地獄を見ます。


shell  2003-11-18 08:34:17  No: 80408

ねろさん、いつもいつもありがとうございます。
あの後、自分なりにコードでラベルを作ることができたのですが、
ネロさんのようにすっきりしたコードではなく、ぐちゃぐちゃしたコードで
なんとか書き上げました。
今回のねろさんが教えてくれたコードで書き直します。

ところでどうしてそんなに簡単に、コードが出てくるのですか?
やっぱりVBの基本をしっかり理解しているからでしょうか.

ところで、新たな疑問ができました。
TABに一度表示させたラベルを、フォームをアンロードすることなく一度消して、
再表示したいです。というのは一度あるデータを表示させて、その後、ほかのデータを表示するよう
なプログラムを作っているのですが、はじめに表示したデータが残ってしまい、2度目に表示させた
データと最初に表示させたデータが混じって表示されてしまうのです。
以下のコードを途中に入れてみましたが、ラベルは消えず、TAB上に残ったままでした。

If TabPage1.Controls.Contains(Lb(n, m)) Then
       Controls.Remove(Lb(n, m))
End If
何がおかしいのでしょうか?


ねろ  2003-11-18 17:52:50  No: 80409

>ネロさんのようにすっきりしたコードではなく
私もまだまだなんですが、後で自分で見て解かり易いコードが一番です。

>Controls.Remove(Lb(n, m))
取り除く場合は
Lb(n, m).Dispose()かな
ただし取り除くより
Lb(n, m).Text = ""  
の方がいいのでは、場合によりますが。


shell  2003-11-19 05:32:29  No: 80410

どうも素早い返答ありがとうございます。
上記の方法でコードから作った升目状に並べたラベルをフォームをアンロードせずに消そうとしましたが、消えてくれませんでした。
ちなみにTabPage1.Controls.Remove(Lb(n, m))を使った場合でも同様でした。
ただしRemove()を使った場合は試しにツールボックスからTABに貼り付けたラベルでは消去可能でした。
やはりコードで作ったラベルを消したかったので、いろいろ試したところ、
TabPage1.Controls.Clear()
としたところほかのコントロールも消えますがラベルを消すことができました。
ところで「TEXTを消すだけではいけないか?」と思われるかもしれません。
いま私が作っているプログラムは升目状に並んだ縦18×横9のラベルに表示させたいデータがあって、そのデーターのグループは10×9だったり12×9だったりで縦の升目数が変わります。
その表示内容に応じて不要な行は表示したくないので、一度ラベルを消して、その後で次の表示データグループを表示させたかったのです。
そこでClear()を使うと上手く消せましたが、TAB状に貼り付けたボタンコントロールも消えてしまいます。
そこでボタンコントロールも同様にしてコードで書こうと思いました。
ところがボタンコントロールにはクリックイベントなどがあります。
コード上で書いて表示させたコントロールでもクリックイベントなど(クリックするともう一つのフォームが現れるなど)の操作は実現できるでしょうか?(できるでしょうが、そのやり方はボタンを貼り付けた場合と違い難しそうです。)


ねろ  2003-11-19 07:02:00  No: 80411

>Lb(2, 2).Dispose()
はやってみましたか?

>そのやり方はボタンを貼り付けた場合と違い難しそうです
簡単です
Dim But(4) As Button
Dim i As Integer
For i = 0 To But.GetLength(0) - 1
    But(i) = New Button
    But(i).Left = But(i).Width * i                'ボタンの配置
    But(i).Top = Lb(9, 4).Top + Lb(9, 4).Height   'ラベルの下に
    But(i).Tag = i                                'タグをセット
    Controls.Add(But(i))                          '忘れないように  
    But(i).Parent = TabPage1                      'コンテナのセット
    AddHandler But(i).Click, AddressOf Buts_Click 'イベントハンドラー
Next
Labelと殆ど同じですが、どのボタンが押されてか判るようにTagをセットします。
後はイベントを作ります。
AddHandler But(i).Click, AddressOf Buts_Click  の部分です

'実際のイベントは
Private Sub Buts_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs)

Dim a As Integer
Select Case sender.tag()
   'ボタンの処理を入れる
   Case 0
   Case 1
   Case 2
   Case 3
   End Select
End Sub
こんな感じです


shell  2003-11-24 20:01:34  No: 80412

Lb(2, 2).Dispose()はやりました。
以前は上手く消えなかったのですが今回もう一度使うと上手く行きました。なんかプログラムが複雑になってきたいるので条件によって消えたり消えなかったりするようです。
私の作っているプログラムは、表示するデータの数がその時々で違っていて、そのたびに表示するラベルの数をデータの数に合わせてあるります。

Dispose()はそのラベルが存在しないときはエラーになったりします。
Clear()ならばその一つ一つが存在するかどうかは問わないので、使いやすいと思いました。でもClear()はボタンなどもすべて消えてしまいます。なのでその都度コードからボタンを生成するようにしようと思います。

ボタンの使い方の例、ありがとうございました。
これで何とかできそうです。
ねろさんの親切な対応のおかげで、スッキリ解決しました。
また何かあればこの掲示板で質問したいと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加